最小二乘法-圆拟合(不啰嗦)
原理:原理部分网上大部分可以搜得到,以一句很简单的话就是是通过最小化误差的平方和找到一组数据的最佳函数匹配(自行百度)。
作用:如果现在有一张图片,需要你拟合图片中的圆。
需要拟合的圆图片:
方法:最小二乘法拟合(原理自行百度)
代码:主代码
clear;
clc;
data=imread('')
[t,SM]=graythresh(data);% T产生的阈值,SM可分性度量
binary_image=imbinarize(data,t); % Otsu's方法的最佳全阈值处 理,二值化图像
binary_image1=medfilt2(binary_image);
im_sub = double(binary_image);
[m,n]=size(im_sub);
im_sub1=edge(im_sub,'canny',t);
bound_position = bwboundaries(im_sub1,8);
Xc = size(im_sub2,2)/2;Yc = size(im_sub2,1)/2;
result = [];
for i = 1:length(bound_position)X = bound_position{i}(:,2);Y = bound_position{i}(:,1);
%% 排除掉非轮廓数据if(length(X)<4)continue;end
[xc,yc,r,a] = circlefit(X,Y);%拟合圆
%% 排除掉非圆的轮廓% if(~inpolygon(xc,yc,X,Y)||r>350||(sqrt((xc-960)^2+(yc-960)^2)>200))if(~inpolygon(xc,yc,X,Y)||(sqrt((xc-m/2)^2+(yc-n/2)^2)>500)||r>1200);continue;endif r<20continue;endresult = [result; xc,yc,r];%保存结果
endtemp= sortrows(result,3);%按半径大小排列
result = temp(1:1:end,:);for i = 1:1:size(dis_x1,1)%PlotCircle(result(i,1),result(i,2),mean(result(i-1:i,3)));hold on;PlotCircle(dis_x1(i,1),dis_x1(i,2),dis_x1(i,3));hold on;
enddisp('-------------拟合结果如下------------')
disp(' 圆心坐标x 圆心坐标y 半径r')
ans = result(1:2:end,:)
以上就通过一些简单的图像处理得到图中圆形图案的边缘坐标信息,下面通过上述的代码获得的边缘像素坐标集,上述中的圆拟合代码如下(最小二乘法)
圆拟合代码:
function [xc,yc,R,a]=circlefit(x,y)
% CIRCLEFIT fits a circle in x,y plane
% x^2+y^2+a(1)*x+a(2)*y+a(3)=0n=length(x);
xx=x.*x;
yy=y.*y;
xy=x.*y;A=[sum(x) sum(y) n;sum(xy) sum(yy) sum(y);sum(xx) sum(xy) sum(x)];
B=[-sum(xx+yy);-sum(xx.*y+yy.*y);-sum(xx.*x+xy.*y)];
a=A\B;
xc = -0.5*a(1);
yc = -0.5*a(2);
% R = sqrt(-(a(3)-xc^2-yc^2));
R = sqrt((a(1)^2+a(2)^2)/4-a(3));
end
画圆程序:
function PlotCircle(xc,yc,r)
theta=0:pi/100:2*pi;
% x=r*cos(theta)+xc; y=r*sin(theta)+yc;x=r*cos(theta)+xc; y=r*sin(theta)+yc;
plot(x,y,'r-','LineWidth',3);
% plot(xc,yc,'r+','LineWidth',5);
% plot(mean(xc),mean(yc),'*','LineWidth',1)
% fill(x,y,'y');
end
效果:
引用请注明出处,谢谢!!
最小二乘法-圆拟合(不啰嗦)相关推荐
- 最小二乘法的拟合原理
一. 最小二乘法的拟合原理 根据<数学指南>书中的解释: 图2 <数学指南>中对最小二乘法的解释 上面这段话,枯燥且无趣,大家不用厌恶,数学向来这个样子. 现在,我们来慢慢认识 ...
- 圆拟合算法(距离之和最小)
上一篇博客介绍了最小二乘法拟合圆的方法.这种方法对误差符合正态分布的数据点很有效.但是在机器视觉应用中经常会碰到一些干扰点.这些干扰点多数时候是偏向某一个方向的.这时要是用最小二乘法拟合,拟合出的圆会 ...
- Java实现最小二乘法线性拟合,传感与检测,单臂半桥全桥实验,江南大学自动化
因为作为资源上传不方便我们获取且我想免费分享给有需要的小伙伴,以后所有实验报告都通过文章形式记录输出了,仅供参考,欢迎交流.(最小二乘法代码在文末) 电桥特性曲线: Java实现最小二乘法线性拟合及计 ...
- 最小二乘法线性拟合及其代码实现(C语言)
文章目录 前言 一.最小二乘法 二.代码实现(C语言) 三.缺陷与不足 1. 对异常值很敏感 2. 没有考虑自变量的误差 3. 存在不可求解的情况 总结 参考 前言 最小二乘法是最常用的数据拟合方法. ...
- 最小二乘法函数拟合原理及matlab实现—数学笔记
最小二乘法函数拟合原理及matlab实现 --数值分析数学笔记 如有纰漏,欢迎指正 文章目录 最小二乘法函数拟合原理及matlab实现 前言 一.拟合标准 1.使偏差向量满足 1 1 1 - 范数 2 ...
- 基于opencv的c++图像处理(霍夫直线检测与最小二乘法直线拟合)
前言 基于opencv的c++接口,实现标准的霍夫直线检测.基于统计概率的霍夫直线检测.以及最小二乘法直线拟合. 相关的opencv接口解析 CV_EXPORTS_W void HoughLines( ...
- 最小二乘法直线拟合、圆拟合
- 最小二乘法多项式拟合的Java实现--转
原文地址:http://blog.csdn.net/funnyrand/article/details/46742561 背景 由于项目中需要根据磁盘的历史使用情况预测未来一段时间的使用情况,决定采用 ...
- 用最小二乘法来拟合数据
标签(空格分隔): 机器学习 最小二乘法是一种常用的数学优化技术.它通过最小化误差的平方和来求取目标函数的最优值,以解决线性回归问题.这是百度百科给出的解释,那么这个拟合的数据从字面上理解,其实就是预 ...
最新文章
- spring boot 搭建 和 全局异常处理
- matlab怎么在c 中调用,在C中调用Matlab (转)
- 【推荐系统】推荐系统中的排序学习
- 今晚直播 | 强化学习在比赛和自动机器学习中的应用简析
- 除留余数法构造哈希表_哈希表算法原理
- CryptoHelper HMAC/X509/RSA/TripleDes/Hash/MD5/SHA1 (Release 3)
- sea 配置资料收集
- dispatcherServlet流程图
- 360CERT网络安全11月月报 | 新增四大双重勒索病毒家族
- 云南省计算机文字录入考试题,计算机文字录入处理员高级试题A
- 加ing形式的单词有哪些_【动词ing变化规律1、直接 ing2、以辅音字母 y结尾的单词,直接 in...-动词ing形式变化规则-英语-贾翘教同学...
- (二)移动 GPU 和桌面 GPU 的差距有哪些?
- 基于规则的中文分词 - NLP中文篇
- ref使用之react / react hook
- Git 设置用户名和邮箱
- 你们要的线上GC问题案例来啦
- C#在Excel与Word中写入上角标与下角标
- 解决各种中文乱码的方法
- php ucenter单点登录,UCenter的应用整合与单点登录分析
- java option请求_Spring boot处理OPTIONS请求
热门文章
- Android录制视频-nv21转nv12姿势(libyuv使用)
- Coding?是不是Coder思维模式
- 字节跳动Java后端笔试题
- win10-你需要来自XXX的权限才能对此文件夹进行更改 转载
- 本地 vs. 云:大数据厮杀的最终幸存者会是谁?— InfoQ专访阿里云智能通用计算平台负责人关涛
- java.io.IOException: setDataSource failed.: status=0x80000000问题的解决
- c# html 解码,C#,.Net Core Escape、Url编码与解码
- nmtui 和 nmcli 命令 配置网络
- 电子政务私有云盘系统建设必备-Mobox政务盘
- 如何用Google Analytics监测百度竞价广告