我正在做一个图像处理项目 . 我有一个灰度图像和检测到边缘与Canny边缘检测 . 现在我想通过过滤不必要的边来操纵结果 . 我想保持接近水平的边缘并删除接近垂直的边缘 .
如何删除接近垂直的边缘?
这取决于允许的成本密集程度 . 一个简单的方法是:
(1)使用Sobel-Filters对图像进行卷积(给出Dx,Dy) .
对于每个canny-edge-pixel:
(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
根据您的要求,您可以对其进行大量优化 .
一种选择是使用Sobel operator的一半 . 完整算法找到水平和垂直边缘,然后组合它们 . 您只对水平边缘感兴趣,因此只需计算该部分(维基百科文章中的 Gy ) .
Gy
您可能还希望将结果阈值化以获得黑白图像而不是灰度阴影 .
您可以将此技术应用于原始灰度图像或Canny边缘检测的结果 .
2 回答
这取决于允许的成本密集程度 . 一个简单的方法是:
(1)使用Sobel-Filters对图像进行卷积(给出Dx,Dy) .
对于每个canny-edge-pixel:
(2)归一化(Dx,Dy),s.t . 在每个像素中,你都有你的边缘方向 .
(3)用你想要移除的方向计算内积(在你的情况下为(0,1)) .
(4)如果内积的绝对值小于某个阈值,则移除像素 .
例:
根据您的要求,您可以对其进行大量优化 .
一种选择是使用Sobel operator的一半 . 完整算法找到水平和垂直边缘,然后组合它们 . 您只对水平边缘感兴趣,因此只需计算该部分(维基百科文章中的
Gy
) .您可能还希望将结果阈值化以获得黑白图像而不是灰度阴影 .
您可以将此技术应用于原始灰度图像或Canny边缘检测的结果 .