如何平滑线条表面以满足一个像素宽度?

时间:2014-07-18 09:55:27

标签: matlab line smooth

平滑线表面有一个小问题。

图像是sobel处理后边缘检测的结果。

表面不平整,凸起单位为一个像素。

红圈部分是凸起。

The result of edge detection after sobel processing.

http://www.mathworks.com/help/matlab/creating_plots/smooth-contour-data-with-convolution-filter.html

我尝试过的链接,但线宽增加了太多。

smooth with convolution twice

我必须得到一个像素宽度的直线。

如何清理这些凸起?

非常感谢。


7/21更新:

Canny方法可以生成一个像素的检测图像。

Canny边缘检测的结果: enter image description here

线被分割成2个部分,下部移动了一个像素。

我希望当线宽在2~3像素范围内时,可以认为是直线而不是2行。

对于扩张和侵蚀,我试图平滑成为直线的线

Canny>扩张:

enter image description here

Canny&gt; <膨胀>侵蚀:

enter image description here

之前和之后的结果是相同的......

有人能给我一个想法吗?

非常感谢。

2 个答案:

答案 0 :(得分:2)

如果你正在处理一个简单的2-D,黑白图像,存储为0/1阵列,并且你保证从上到下总是有一条直线,那么这可能是帮助 -

% recreate scenario
A = zeros(100,50);
A(:,25) = 1;
A([30:40,80:85],24)=1;
A([20:35,70:90],26)=1;
% a rude way
S = sum(A,1);
B = repmat(S==max(S),100,1);
imshow(B)

答案 1 :(得分:1)

也许类似于Canny edge detection的方法可能是您要搜索的解决方案。 Canny边缘检测器使用非最大抑制,这意味着边缘仅由在其邻居之间具有最大梯度的像素形成,导致在一个像素宽度边缘中的许多情况。