【问题标题】:Matlab manipulate edgesMatlab 处理边缘
【发布时间】:2013-04-26 13:46:42
【问题描述】:

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

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

【问题讨论】:

  • 如何定义条件“接近垂直边缘”?
  • 使用具有足够宽度的垂直形状结构元素的形态开口。比如:stackoverflow.com/a/11015774/97160
  • @ArnoldVámos:张贴示例图片,让我们进行实验

标签: matlab image-processing edge-detection


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    (1) 使用 Sobel-Filters 对图像进行卷积(给出 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
    

    您可以根据自己的要求对其进行大量优化。

    【讨论】:

      猜你喜欢
      • 2014-08-25
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 2017-06-02
      • 2012-07-09
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多