声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2878|回复: 15

[编程技巧] 你好 求教一下直线拟合的问题

[复制链接]
发表于 2010-1-31 13:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

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

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

需要处理的图像

需要处理的图像

算法理论图示

算法理论图示
回复
分享到:

使用道具 举报

发表于 2010-1-31 15:19 | 显示全部楼层

回复 楼主 songkang 的帖子

发表于 2010-1-31 17:32 | 显示全部楼层

详见源代码

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

源代码如下:

圆心识别的源代码

圆心识别的源代码


运行结果如下:

运行结果

运行结果

评分

1

查看全部评分

 楼主| 发表于 2010-1-31 18:25 | 显示全部楼层
谢谢freeplus!:handshake
 楼主| 发表于 2010-1-31 18:25 | 显示全部楼层
也谢谢chaching!:loveliness:
发表于 2010-1-31 21:47 | 显示全部楼层

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

..........................
 楼主| 发表于 2010-2-3 22:06 | 显示全部楼层
我按照你的程序进行处理的时候  uigetfile命令让选择一个图片,我选择之后 系统老是说??? Error using ==> imread
File "1361.JPGE:\matlab\work\" does not exist.  我已经把1361.jpg图片放在WORK文件夹里面了,这是怎么回事??麻烦你了
发表于 2010-2-3 23:21 | 显示全部楼层
平常个人会试过再评分!
这个未试过, 仅大约看过! 懒得花时间自己输一遍
建议LZ给齐资料别人好试!
 楼主| 发表于 2010-2-4 00:06 | 显示全部楼层
function Circle_Recognize_test
[DATAfile DATApath]=uigetfile('1361.JPG');
FileNamel=[DATAfile DATApath];
I1=im2bw(imread(FileNamel));    %读入图片到矩阵I1
[h1,w1]=size(I1);
yLine=[];             %存放y方向扫描的中点集
for r1=1:h1
    x1=find(I1(r1,:)==1);  %采用median函数求中点可以去除噪声干扰
    if (length(x1)>=2),yLine=[yLine;[median(x1),r1]]; end;
end;
xLine=[];
imshow(xline)
for c1=1:w1
    y1=find(I1(:,c1)==1);
    if (length(y1)>=2),xLine=[xLine;[c1,median(y1)]]; end;
end;

px=polyfit(xLine(:,1),xLine(:,2),1);%直线拟合
py=polyfit(yLine(:,2),yLine(:,1),1);
xLine=[round(xLine(:,1)),round(polyval(px,xline(:,1)))];%得到拟合直线
yLine=[round(polyval(py,yline(:,2))),round(yLine(:,2))];
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试一下看看是什么问题  谢谢了
发表于 2010-2-4 10:56 | 显示全部楼层

回复 9楼 songkang 的帖子

FileNamel=[DATAfile DATApath];  % error!!
change to
FileNamel=[DATApath,DATAfile];
 楼主| 发表于 2010-2-4 12:51 | 显示全部楼层
谢谢chaching!调入图片的问题解决了,可是还是运行不了,说是??? Undefined function or variable "xline".这是怎么回事儿?麻烦你再给看看。
发表于 2010-2-5 22:43 | 显示全部楼层
麻烦LZ有空看下本版规则!
3)相同或相近内容的话题,请勿开新贴,一帖发完! (so一个模样的新帖就删了!)
6)求助完整格式:出错代码和出错提示
而且出错提示尽量完整些! 总不能一定要别人执行过, 方能回应给建议!

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

[ 本帖最后由 ChaChing 于 2010-2-5 22:53 编辑 ]
 楼主| 发表于 2010-2-5 23:47 | 显示全部楼层
谢谢chaching!你的批评是对的,我细心的查找了一下,的确有几处错误,是我太粗心了。谢谢你的指正。
改正之后的程序仍然存在问题,请你再给看看。谢谢!
三楼的程序是
function Circle_Recognize_test
[DATAfile DATApath]=uigetfile('1361.JPG');
FileNamel=[DATApath DATAfile];
I1=im2bw(imread(FileNamel));    %读入图片到矩阵I1
[h1,w1]=size(I1);
yLine=[];             %存放y方向扫描的中点集
for r1=1:h1
    x1=find(I1(r1,:)==1);  %采用median函数求中点可以去除噪声干扰
    if (length(x1)>=2),yLine=[yLine;[median(x1),r1]]; end;
end;
xLine=[];
for c1=1:w1
    y1=find(I1(:,c1)==1);
    if (length(y1)>=2),xLine=[xLine;[c1,median(y1)]]; end;
end;

px=polyfit(xLine(:,1),xLine(:,2),1);%直线拟合
py=polyfit(yLine(:,2),yLine(:,1),1);
xLine1=[round(xLine(:,1)), round(polyval(px,xline(:,1)))];  %得到拟合直线
yLine1=[round(polyval(py,yline(:,2))), round(yLine(:,2))];
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还不熟悉,谢谢了!
发表于 2010-2-9 07:21 | 显示全部楼层

回复 13楼 songkang 的帖子

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

评分

1

查看全部评分

 楼主| 发表于 2010-2-9 14:09 | 显示全部楼层
程序已经调好,谢谢friendchj,谢谢chaching,更谢谢freeplus.
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-9-22 01:25 , Processed in 0.067427 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表