songkang 发表于 2010-1-31 13:46

你好 求教一下直线拟合的问题

直线拟合求交点提取轴端面图像边界,得到一个圆形的边界,想求它的圆心坐标,
具体方法是:
1设E为一椭圆或圆,现对E自上而下扫描.。假设每一水平扫描线与E相交于两点,然后求取运算两点间距离的中点,则可得所有水平线段的中点,这些点是离散的点,运用最小二乘法对其进行直线拟合,求得拟合直线。(如附件图示)

2用同样的方法,在垂直方向逐步扫描,分别求中点,进行直线拟合,
3求拟合直线1和2的交点,即为边界圆圆心的坐标(注:在水平和垂直扫描的时候,有可能在某些水平线上是没有像素点的,这样的情况舍掉即可)

图像在附件离, 请高手帮帮忙,谢谢了

ChaChing 发表于 2010-1-31 15:19

回复 楼主 songkang 的帖子

先看看这帖, 有没帮助!
http://forum.vibunion.com/forum/viewthread.php?tid=73147

freeplus 发表于 2010-1-31 17:32

详见源代码

几点说明:
1 源码用Matlab编写,完全按照你的思路来的
2 你给出的图片中含有大量的噪声,应该首先进行去噪,然后进行图像修补(膨胀、细化),这样有利于提高识别精度和稳定性
3 这里给出的代码也适合于识别不是很扁的椭圆的中心
4 代码中的yLine拟合时x和y坐标交换了一下,提高拟合精度(因为Matlab的拟合函数无法处理x数列没有排序的情形)

源代码如下:


运行结果如下:

songkang 发表于 2010-1-31 18:25

谢谢freeplus!:handshake

songkang 发表于 2010-1-31 18:25

也谢谢chaching!:loveliness:

freeplus 发表于 2010-1-31 21:47

源代码只有自己输一遍才会掌握,呵呵。

..........................

songkang 发表于 2010-2-3 22:06

我按照你的程序进行处理的时候uigetfile命令让选择一个图片,我选择之后 系统老是说??? Error using ==> imread
File "1361.JPGE:\matlab\work\" does not exist.我已经把1361.jpg图片放在WORK文件夹里面了,这是怎么回事??麻烦你了

ChaChing 发表于 2010-2-3 23:21

平常个人会试过再评分!
这个未试过, 仅大约看过! 懒得花时间自己输一遍
建议LZ给齐资料别人好试!

songkang 发表于 2010-2-4 00:06

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试一下看看是什么问题谢谢了

ChaChing 发表于 2010-2-4 10:56

回复 9楼 songkang 的帖子

FileNamel=;% error!!
change to
FileNamel=;

songkang 发表于 2010-2-4 12:51

谢谢chaching!调入图片的问题解决了,可是还是运行不了,说是??? Undefined function or variable "xline".这是怎么回事儿?麻烦你再给看看。

ChaChing 发表于 2010-2-5 22:43

麻烦LZ有空看下本版规则!
3)相同或相近内容的话题,请勿开新贴,一帖发完! (so一个模样的新帖就删了!)
6)求助完整格式:出错代码和出错提示
而且出错提示尽量完整些! 总不能一定要别人执行过, 方能回应给建议!

最后, 给个建议, 详细对下3F给的代码, 不难发现LZ的错误!

[ 本帖最后由 ChaChing 于 2010-2-5 22:53 编辑 ]

songkang 发表于 2010-2-5 23:47

谢谢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还不熟悉,谢谢了!

friendchj 发表于 2010-2-9 07:21

回复 13楼 songkang 的帖子

注意Matlab对变量名区别大小写,把变量xLine和xline统一起来,用xLine或xline表示。

songkang 发表于 2010-2-9 14:09

程序已经调好,谢谢friendchj,谢谢chaching,更谢谢freeplus.
页: [1] 2
查看完整版本: 你好 求教一下直线拟合的问题