【问题标题】:Orientational Canny Edge Detection定向 Canny 边缘检测
【发布时间】:2017-04-22 13:37:09
【问题描述】:

我想使用 Canny 方法检测边缘。最后我想要两个边缘图:1 代表水平方向 1 代表垂直方向。

在 MATLAB 中,这可以通过使用带有额外方向参数的 Sobel 或 Prewitt 运算符来实现,但对于 Canny,我们没有此选项。

E = edge(I,'Sobel','horizontal')

知道如何使用 Canny 分别提取水平和垂直边缘吗?

【问题讨论】:

  • 您应该首先阅读精明边缘算法的工作原理...精明边缘检测是双向的,提取水平或垂直边缘没有意义。
  • @obchardon 来自您提供的链接:“方向四舍五入到四个可能角度之一(即 0、45、90 或 135)”所以我假设这些是垂直、水平、对角线-左,对角线右。我只对垂直和水平的感兴趣。

标签: matlab image-processing canny-operator


【解决方案1】:

无法使用内置的edge 函数。但是,Canny 边缘检测使用来自Sobel Operator 的角度。重现这些值非常容易。

  1. 从图像开始,我将使用内置的演示图像。

    A = im2double(rgb2gray(imread('peppers.png')));
    
  2. 获得 Canny 优势

    A_canny = edge(A, 'Canny');
    
  3. Sobel Operator -- 我们不能使用内置的实现 (edge(A_filter, 'Sobel')),因为我们想要边缘角度,而不仅仅是边缘位置,所以我们实现了自己的运算符。

    一个。高斯滤波器。这是 Canny 的预处理步骤,所以我们应该在这里重现它

    A_filter = imgaussfilt(A);
    

    b.卷积找到方向梯度

    %These filters measure the difference in values between vertically or horizontally adjacent pixels. 
    %Effectively, this finds vertical and horizontal gradients.
    vertical_filter = [-1 0 1; -2 0 2; -1 0 1];
    horizontal_filter = [-1 -2 -1; 0 0 0; 1 2 1];
    A_vertical = conv2(A_filter, vertical_filter, 'same');
    A_horizontal = conv2(A_filter, horizontal_filter, 'same');
    

    c。计算角度

    A_angle = arctan(A_vertical./A_horizontal);
    
  4. 获取边缘位置的角度值

    A_canny_angles = nan(size(A));
    A_canny_angles(A_canny) = A_angle(A_canny);
    
  5. 选择你感兴趣的角度

    angle_tolerance = 22.5/180*pi;
    target_angle = 0;
    A_target_angle = A_canny_angles >= target_angle*pi/180 - angle_tolerance & ...
        A_canny_angles<= target_angle*pi/180 + angle_tolerance;
    

因此,如果我正在寻找水平线,我的目标角度将为零。下图说明了步骤 1、2、4 和 5。提取的水平线的最终结果显示在右下角。您可以看到它们不是完全水平的,因为我使用了如此大的角度容差窗口。这是一个可调参数,具体取决于您想要达到目标角度的准确程度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多