声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1279|回复: 4

[图像处理] 如何提出圆环内边界?

[复制链接]
发表于 2007-11-26 21:47 | 显示全部楼层 |阅读模式

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

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

x
我有一组数据需要进行环拟合,现在已完成环的外圆拟合,内圆边界点提取一直不理想(如图),麻烦大家指点一下。
图中空白部分数据设定为NaN。

我的程序:
[filename, pathname] = uigetfile('*.txt','Open Data');
filepath = strcat(pathname,filename);
if length(filepath) == 0
    return;
end
Data = textread(filepath,'','delimiter',';','emptyvalue',NaN);
pcolor(Data), axis equal,axis tight, shading interp;
colorbar; hold on;
% 找出圆环的外边界,并进行最小二乘圆拟合
BoundIdx = []; BoundIdy = [];
for k1=1:size(Data,1)
    NaNIdx=find(isnan(Data(k1,:)));
    JumpSize=diff(NaNIdx);
    BI=find(JumpSize>=2);
    BINum = length(BI);
    if ~(isempty(BI))
         BoundIdx = [BoundIdx NaNIdx(BI(1)) NaNIdx(BI(BINum)+1)];  
         BoundIdy = [BoundIdy k1 k1];
    end
end
[xc,yc,R] = circfit(BoundIdx,BoundIdy);
t = linspace(0,pi*2,100);
z = xc+yc*i+R*exp(i*t);
%plot(BoundIdx,BoundIdy,'kx');
plot(z); hold on;
R = round(R); xc = round(xc); yc = round(yc);
% 找出圆环的内边界,并进行最小二乘圆拟合
BoundIdx = []; BoundIdy = [];
for k1=yc-R:yc+R
    if ~(isnan(Data(k1,xc))&isnan(Data(2*yc-k1,xc)))   
        continue;
    end
    ValueIdx=find(~isnan(Data(k1,xc:xc+R)));
    if ~(isempty(ValueIdx))
         BoundIdx = [BoundIdx ValueIdx(1)-1+xc];  
         BoundIdy = [BoundIdy k1];
    end
    ValueIdx=find(~isnan(Data(k1,xc:-1:xc-R)));
    if ~(isempty(ValueIdx))
         BoundIdx = [BoundIdx -ValueIdx(1)+1+xc];  
         BoundIdy = [BoundIdy k1];
    end
end
[xc2,yc2,R2] = circfit(BoundIdx,BoundIdy);
t = linspace(0,pi*2,100);
z = xc2+yc2*i+R2*exp(i*t);
plot(BoundIdx,BoundIdy,'bx');
plot(z); hold off;

数据图样

数据图样
回复
分享到:

使用道具 举报

发表于 2007-11-26 21:54 | 显示全部楼层
可以考虑使用最临近插值,然后使用形态学或者边缘检测的方法求出内边界。

另外论坛有一个圆的拟合程序,数据点数足够了,你可以找找看
 楼主| 发表于 2007-11-26 22:12 | 显示全部楼层
圆拟合程序已经有了。现在想尽量找出环的内圆所有边界点
使用最临近插值不会破坏原有的有效数据吗?
发表于 2007-11-26 22:20 | 显示全部楼层

回复 #3 fsnow 的帖子

我没表述准确,这个问题不适合用拟合或者插值
用邻域元素的一些统计特征来填补缺失的数据似乎更科学

[ 本帖最后由 eight 于 2007-11-26 22:49 编辑 ]
发表于 2007-11-26 23:27 | 显示全部楼层
把图形从中间沿最大最小值连线分成两组数据,然后用最优化理论中的Pareto解判断的思想分类就可以把内边界给找出来了。具体内容自己找书看吧。

另外,你外边界都找出来了,内边界不也一样么?只是相对位置关系变了。

[ 本帖最后由 心灯 于 2007-11-26 23:28 编辑 ]

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-18 14:27 , Processed in 0.066812 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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