首页 文章

Matlab操纵边缘

提问于
浏览
1

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

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

2 回答

  • 3

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

    (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
    

    根据您的要求,您可以对其进行大量优化 .

  • 2

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

    您可能还希望将结果阈值化以获得黑白图像而不是灰度阴影 .

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

相关问题