我正在处理一个图像处理项目。我有一个灰度图像和Canny边缘检测边缘检测。现在我想通过过滤不必要的边来操纵结果。我想保持接近水平的边缘并删除接近垂直的边缘。Matlab处理边缘
如何删除接近垂直边缘?
我正在处理一个图像处理项目。我有一个灰度图像和Canny边缘检测边缘检测。现在我想通过过滤不必要的边来操纵结果。我想保持接近水平的边缘并删除接近垂直的边缘。Matlab处理边缘
如何删除接近垂直边缘?
这取决于如何允许成本密集。一个简单的方法是:
(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
您可以优化了很多,由于您的要求。
谢谢,这个作品真的很好! – 2013-04-29 12:47:27
一种选择是使用Sobel operator的一半。完整的算法找到水平和垂直边缘,然后将它们组合。你只对水平边缘感兴趣,所以只需计算该部分(这是维基百科文章中的Gy
)。
您可能还想要将结果阈值设置为黑白图像而不是灰色阴影。
您可以将此技术应用于原始灰度图像或Canny边缘检测的结果。
如何定义条件'接近垂直边缘'? – 2013-04-26 13:49:00
使用具有足够宽度的垂直形状结构元件的形态开口。像这样:http://stackoverflow.com/a/11015774/97160 – Amro 2013-04-26 13:57:15
@ArnoldVámos:发布一个示例图片,它会让我们试验 – Amro 2013-04-26 17:26:02