我有这个二进制图像bw
:
物体的边缘进行一些测量。但首先我必须对两个边缘进行曲线拟合。结果应该是代表边缘的两条平滑曲线。
我有每个边缘的索引,但我不能使用它们来使 xy 数据成为拟合函数的输入数据。我的意思是它们不是x
,f(x)
实际上,它们都具有相同的值 (1),但位置不同。说是不对的[x y]=find(BW)
;y
这里不是 的值x
,但肯定应该有一种方法可以使用它们对二进制图像进行某种缩放。我似乎很困惑,我被困在这里。
有什么建议吗?
我有这个二进制图像bw
:
物体的边缘进行一些测量。但首先我必须对两个边缘进行曲线拟合。结果应该是代表边缘的两条平滑曲线。
我有每个边缘的索引,但我不能使用它们来使 xy 数据成为拟合函数的输入数据。我的意思是它们不是x
,f(x)
实际上,它们都具有相同的值 (1),但位置不同。说是不对的[x y]=find(BW)
;y
这里不是 的值x
,但肯定应该有一种方法可以使用它们对二进制图像进行某种缩放。我似乎很困惑,我被困在这里。
有什么建议吗?
为什么不使用polyfit
?
[y x] = find( bw ); %// get x y coordinates of all curve points
您需要在这里使用两个小“技巧”:
您有两条曲线,因此您需要将数据点拆分为左右曲线
right = x<300;
xr = x(right);
yr = y(right);
xl = x(~right);
yl = y(~right);
由于您的曲线接近垂直,因此最好适合x=f(y)
而不是“经典” 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');