二值图像的曲线拟合,MATLAB

二值图像的曲线拟合,MATLAB,matlab,image-processing,curve-fitting,binary-image,Matlab,Image Processing,Curve Fitting,Binary Image,我有这个二进制图像bw: 对物体的边缘进行一些测量。但首先我必须对两条边进行曲线拟合。结果应该是两条表示边的平滑曲线 我有每条边的索引,但我不能将它们用于将x-y数据作为拟合函数的输入数据。我的意思是它们不是x和f(x),实际上,它们在不同的位置都有相同的值(1)。说[xy]=find(BW)是不对的y这里不是x处的值,但可以肯定的是,应该有一种方法可以使用它们来对二进制图像进行某种缩放。我看起来很困惑,我被困在这里了 有什么建议吗?为什么不使用 这里需要使用两个小“技巧”: 您有两条曲线,因

我有这个二进制图像
bw

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

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

有什么建议吗?

为什么不使用

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

  • 您有两条曲线,因此需要将数据点拆分为左曲线和右曲线

    right = x<300;
    xr = x(right);
    yr = y(right);
    xl = x(~right);
    yl = y(~right);
    
  • 现在你可以绘制它们了

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

    你想得到属于一条直线的每个像素的坐标,然后拟合一个函数
    [x;y]=f(t)
    这是可行的,但只是为了绘图,我实际上需要在二值图像本身中,而不仅仅是绘图中,使新的曲线索引“逻辑”(one)。我试过了,但似乎我遗漏了什么,你能在最后一步帮我吗?@MohamedSayed你可以得到每行值(y)的列值(X),然后对X值进行四舍五入以获得指示。我感谢你的帮助,但说实话,在我试过之后,我仍然做不到。我认为这些点在二值图像中是离散的或分离的,而不是平滑的“连续”曲线@根据定义,二值图像中的点是离散的。你不能在非整数位置设置像素我知道,我不是这个意思。我的意思是,我需要为每一行设置一个“逻辑值”。换句话说,曲线中应该没有间隙……无论如何,当我尝试你的建议时,相同的旧边出现了,因为每一行都有多个列值,而不仅仅是一个。
    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');