你好 求教一下直线拟合的问题
直线拟合求交点提取轴端面图像边界,得到一个圆形的边界,想求它的圆心坐标,具体方法是:
1设E为一椭圆或圆,现对E自上而下扫描.。假设每一水平扫描线与E相交于两点,然后求取运算两点间距离的中点,则可得所有水平线段的中点,这些点是离散的点,运用最小二乘法对其进行直线拟合,求得拟合直线。(如附件图示)
2用同样的方法,在垂直方向逐步扫描,分别求中点,进行直线拟合,
3求拟合直线1和2的交点,即为边界圆圆心的坐标(注:在水平和垂直扫描的时候,有可能在某些水平线上是没有像素点的,这样的情况舍掉即可)
图像在附件离, 请高手帮帮忙,谢谢了
回复 楼主 songkang 的帖子
先看看这帖, 有没帮助!http://forum.vibunion.com/forum/viewthread.php?tid=73147
详见源代码
几点说明:1 源码用Matlab编写,完全按照你的思路来的
2 你给出的图片中含有大量的噪声,应该首先进行去噪,然后进行图像修补(膨胀、细化),这样有利于提高识别精度和稳定性
3 这里给出的代码也适合于识别不是很扁的椭圆的中心
4 代码中的yLine拟合时x和y坐标交换了一下,提高拟合精度(因为Matlab的拟合函数无法处理x数列没有排序的情形)
源代码如下:
运行结果如下:
谢谢freeplus!:handshake 也谢谢chaching!:loveliness:
源代码只有自己输一遍才会掌握,呵呵。
.......................... 我按照你的程序进行处理的时候uigetfile命令让选择一个图片,我选择之后 系统老是说??? Error using ==> imreadFile "1361.JPGE:\matlab\work\" does not exist.我已经把1361.jpg图片放在WORK文件夹里面了,这是怎么回事??麻烦你了 平常个人会试过再评分!
这个未试过, 仅大约看过! 懒得花时间自己输一遍
建议LZ给齐资料别人好试! function Circle_Recognize_test
=uigetfile('1361.JPG');
FileNamel=;
I1=im2bw(imread(FileNamel)); %读入图片到矩阵I1
=size(I1);
yLine=[]; %存放y方向扫描的中点集
for r1=1:h1
x1=find(I1(r1,:)==1);%采用median函数求中点可以去除噪声干扰
if (length(x1)>=2),yLine=]; end;
end;
xLine=[];
imshow(xline)
for c1=1:w1
y1=find(I1(:,c1)==1);
if (length(y1)>=2),xLine=]; end;
end;
px=polyfit(xLine(:,1),xLine(:,2),1);%直线拟合
py=polyfit(yLine(:,2),yLine(:,1),1);
xLine=;%得到拟合直线
yLine=;
x0=round((py(2)+py(1)*px(2))/(1-px(1)*py(1))); %计算两条直线交点
y0=round(px(1)*x0+px(2));
I2=I1;
for k=1:size(xLine1,1),I2(xLine1(k,2),xLine1(k,1))=1 end;%画直线
for k=1:size(yLine1,1),I2(yLine1(k,2),yLine1(k,1))=1 end;
I2(y0,x0)=1;%画交点
figue, imshow(I2),axis on;title(sprintf('圆心坐标为;(%d,%d)',x0,y0));
图片就是上面的那个 圆边界图片 麻烦chaching试一下看看是什么问题谢谢了
回复 9楼 songkang 的帖子
FileNamel=;% error!!change to
FileNamel=; 谢谢chaching!调入图片的问题解决了,可是还是运行不了,说是??? Undefined function or variable "xline".这是怎么回事儿?麻烦你再给看看。 麻烦LZ有空看下本版规则!
3)相同或相近内容的话题,请勿开新贴,一帖发完! (so一个模样的新帖就删了!)
6)求助完整格式:出错代码和出错提示
而且出错提示尽量完整些! 总不能一定要别人执行过, 方能回应给建议!
最后, 给个建议, 详细对下3F给的代码, 不难发现LZ的错误!
[ 本帖最后由 ChaChing 于 2010-2-5 22:53 编辑 ] 谢谢chaching!你的批评是对的,我细心的查找了一下,的确有几处错误,是我太粗心了。谢谢你的指正。
改正之后的程序仍然存在问题,请你再给看看。谢谢!
三楼的程序是
function Circle_Recognize_test
=uigetfile('1361.JPG');
FileNamel=;
I1=im2bw(imread(FileNamel)); %读入图片到矩阵I1
=size(I1);
yLine=[]; %存放y方向扫描的中点集
for r1=1:h1
x1=find(I1(r1,:)==1);%采用median函数求中点可以去除噪声干扰
if (length(x1)>=2),yLine=]; end;
end;
xLine=[];
for c1=1:w1
y1=find(I1(:,c1)==1);
if (length(y1)>=2),xLine=]; end;
end;
px=polyfit(xLine(:,1),xLine(:,2),1);%直线拟合
py=polyfit(yLine(:,2),yLine(:,1),1);
xLine1=;%得到拟合直线
yLine1=;
x0=round((py(2)+py(1)*px(2))/(1-px(1)*py(1))); %计算两条直线交点
y0=round(px(1)*x0+px(2));
I2=I1;
for k=1:size(xLine1,1),I2(xLine1(k,2),xLine1(k,1))=1 end;%画直线
for k=1:size(yLine1,1),I2(yLine1(k,2),yLine1(k,1))=1 end;
I2(y0,x0)=1;%画交点
figue, imshow(I2),axis on;title(sprintf('圆心坐标为:(%d,%d)',x0,y0));
错误显示为:??? Undefined function or variable "xline".麻烦你再给看看,我现在对MATLAB还不熟悉,谢谢了!
回复 13楼 songkang 的帖子
注意Matlab对变量名区别大小写,把变量xLine和xline统一起来,用xLine或xline表示。 程序已经调好,谢谢friendchj,谢谢chaching,更谢谢freeplus.
页:
[1]
2