二值图像中的曲线拟合,MATLAB

3

我有这张二进制图片bw

enter image description here

我想要测量物体的边缘并进行一些测量。但首先,我需要对两个边缘进行曲线拟合。结果应该是代表边缘的两条平滑曲线。

我已经得到了每个边缘的索引,但是我无法将它们用于制作x-y数据作为拟合函数的输入数据。我的意思是它们不是xf(x),实际上它们都具有相同的值(1),只是位置不同。不能说 [x y]=find(BW);这里的y不是x处的值,但肯定有一种方法可以使用它们来某种方式来缩放二进制图像。我似乎很困惑,卡在这里了。

有任何建议吗?


你想获取属于一条线的每个像素的(x,y)坐标,然后拟合一个函数[x;y]=f(t) - Jonas
1个回答

4

为什么不使用polyfit

[y x] = find( bw );  %// get x y coordinates of all curve points

这里有两个小“技巧”需要使用:

  1. You have two curves, thus you need to split your data points to the left and right curves

    right = x<300;
    xr = x(right);
    yr = y(right);
    xl = x(~right);
    yl = y(~right);
    
  2. Since your curves are close to vertical, it would be better to fit x=f(y) rather than the "classic" y=f(x):

    pr = polyfit( yr, xr, 3 );  %// fit 3rd deg poly
    pl = polyfit( yl, xl, 3 ); 
    
现在您可以将它们绘制出来。
yy = linspace( 1, size(bw,1), 50 );

figure; imshow(bw, 'border', 'tight' );
hold all
plot( polyval( pr, yy ), yy, '.-', 'LineWidth', 1 );
plot( polyval( pl, yy ), yy, '.-', 'LineWidth', 1 );

你会得到:

enter image description here

如果你想从估计的曲线创建一个新的精细掩模,可以按照以下步骤操作:

yy = 1:size(bw,1);  %// single value per row
xxr=polyval(pr,yy); %// corresponding column values
xxl=polyval(pl,yy);

设置一个相同尺寸的新掩模

nbw = false(size(bw)); 
nbw( sub2ind(size(bw),yy,round(xxr)) )=true;
nbw( sub2ind(size(bw), yy, round(xxl) )) = true; 

结果如下

figure;imshow(nbw,'border','tight');

enter image description here


它能工作,但只是用于绘图,我实际上需要在二进制图像本身中使新曲线索引“逻辑”(Ones),而不仅仅是绘图。我已经尝试过了,但似乎我漏掉了一些东西,你能帮我完成这最后一步吗? - Mohamed Sayed
@MohamedSayed 你可以获取每行值(y)的列值(X),然后将X值四舍五入以获取索引。 - Shai
我很感激你的帮助,但说实话,经过我的尝试后,我仍然做不到。而且我认为这些点在二进制图像中会是离散或分离的,而不是平滑的“连续”曲线! - Mohamed Sayed
@MohamedSayed 二进制图像中的点是离散的,这是定义。你不能在非整数位置设置像素。 - Shai
我知道,我不是那个意思。我的意思是每一行都需要有一个“逻辑上的1”。换句话说,曲线上不应该有间隙...无论如何,当我尝试了你的建议后,因为每一行都有多个列值而不仅仅是一个,所以还是出现了相同的旧边缘。 - Mohamed Sayed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接