2013-04-26 137 views
1

我正在处理一个图像处理项目。我有一个灰度图像和Canny边缘检测边缘检测。现在我想通过过滤不必要的边来操纵结果。我想保持接近水平的边缘并删除接近垂直的边缘。Matlab处理边缘

如何删除接近垂直边缘?

+0

如何定义条件'接近垂直边缘'? – 2013-04-26 13:49:00

+0

使用具有足够宽度的垂直形状结构元件的形态开口。像这样:http://stackoverflow.com/a/11015774/97160 – Amro 2013-04-26 13:57:15

+0

@ArnoldVámos:发布一个示例图片,它会让我们试验 – Amro 2013-04-26 17:26:02

回答

2

这取决于如何允许成本密集。一个简单的方法是:

(1)使用Sobel滤镜(给出Dx,Dy)对图像进行卷积。

对于每个精明边缘像素:

(2)规范化(DX,DY),S.T.在每个像素中你都有你的边缘的方向。 (3)用你想删除的方向计算内部产品(在你的情况下(0,1))。 (4)如果内积的绝对值小于某阈值,则去除像素。

例子:

img = ...; 
canny_img = ...; 
removeDir = [0;1]; 
% convolute with sobel masks 
sobelX = [1, 0, -1; 2, 0, -2; 1, 0, -1]; 
sobelY = sobelX'; 
DxImg = conv2(img,sobelX,'same'); 
DyImg = conv2(img,sobelY,'same'); 
% for each canny-edge-pixel: 
for lin = 1:size(img,1) % <-> y 
    for col = 1:size(img,2) % <-> x 
     if canny_img(lin,col) 
      % normalize direction 
      normDir = [DxImg(lin,col); DyImg(lin,col)]; 
      normDir = normDir/norm(normDir,2); 
      % inner product 
      innerP = normDir' * removeDir; 
      % remove edge? 
      if abs(innerP) < cos(45/180*pi) % 45° threshold 
       canny_img(lin,col) = 0; 
      end 
     end 
    end 
end 

您可以优化了很多,由于您的要求。

+0

谢谢,这个作品真的很好! – 2013-04-29 12:47:27

3

一种选择是使用Sobel operator的一半。完整的算法找到水平和垂直边缘,然后将它们组合。你只对水平边缘感兴趣,所以只需计算该部分(这是维基百科文章中的Gy)。

您可能还想要将结果阈值设置为黑白图像而不是灰色阴影。

您可以将此技术应用于原始灰度图像或Canny边缘检测的结果。