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

Curve Fitting in a binary image, MATLAB

我有这个二进制图像 bw:

对象的边缘进行一些测量。但首先我必须对两条边进行曲线拟合。结果应该是代表边缘的两条平滑曲线。

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

有什么建议吗?

为什么不使用 polyfit

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

这里有两个小"tricks"需要用到:

  1. 您有两条曲线,因此您需要将数据点拆分到左右曲线

    right = x<300;
    xr = x(right);
    yr = y(right);
    xl = x(~right);
    yl = y(~right);
    
  2. 因为你的曲线接近于垂直,所以适合 x=f(y) 而不是 "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 );

你得到:

如果您想从估计的曲线创建一个新的细化蒙版,您可以执行以下操作:

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');