1

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

如何删除接近垂直的边缘?

4

2 回答 2

3

一种选择是使用Sobel 算子的一半。完整的算法找到水平和垂直边缘,然后将它们组合起来。您只对水平边缘感兴趣,因此只需计算该部分(Gy在 Wikipedia 文章中)。

您可能还希望对结果进行阈值处理以获得黑白图像而不是灰色阴影。

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

于 2013-04-26T14:07:37.943 回答
2

这取决于允许的成本密集程度。一种简单的方法是:

(1) 使用 Sobel-Filters 对图像进行卷积(给出 Dx、Dy)。

对于每个精明边缘像素:

(2) 归一化 (Dx, Dy), st 在每个像素中你有你的边缘方向。

(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-26T14:20:38.937 回答