定向 Canny 边缘检测
Orientational Canny Edge Detection
我想用Canny方法检测边缘。最后我想要两个边缘图:1 个用于水平方向,1 个用于垂直方向。
在 MATLAB 中,这可以通过使用带有额外方向参数的 Sobel 或 Prewitt 运算符来实现,但对于 Canny,我们没有此选项。
E = edge(I,'Sobel','horizontal')
知道如何使用 Canny 分别提取水平和垂直边缘吗?
无法使用内置 edge
function. However, Canny edge detection uses the angles from the Sobel Operator。重现这些值非常容易。
从图像开始,我将使用内置的演示图像。
A = im2double(rgb2gray(imread('peppers.png')));
获取 Canny 边
A_canny = edge(A, 'Canny');
Sobel 运算符——我们不能使用内置实现 (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);
获取边缘位置的角度值
A_canny_angles = nan(size(A));
A_canny_angles(A_canny) = A_angle(A_canny);
选择您感兴趣的角度
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。提取的水平线的最终结果显示在右下方。你可以看到它们并不完全水平,因为我使用了这么大的角度公差 window。这是一个可调参数,具体取决于您希望达到目标角度的精确程度。
我想用Canny方法检测边缘。最后我想要两个边缘图:1 个用于水平方向,1 个用于垂直方向。
在 MATLAB 中,这可以通过使用带有额外方向参数的 Sobel 或 Prewitt 运算符来实现,但对于 Canny,我们没有此选项。
E = edge(I,'Sobel','horizontal')
知道如何使用 Canny 分别提取水平和垂直边缘吗?
无法使用内置 edge
function. However, Canny edge detection uses the angles from the Sobel Operator。重现这些值非常容易。
从图像开始,我将使用内置的演示图像。
A = im2double(rgb2gray(imread('peppers.png')));
获取 Canny 边
A_canny = edge(A, 'Canny');
Sobel 运算符——我们不能使用内置实现 (
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);
获取边缘位置的角度值
A_canny_angles = nan(size(A)); A_canny_angles(A_canny) = A_angle(A_canny);
选择您感兴趣的角度
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。提取的水平线的最终结果显示在右下方。你可以看到它们并不完全水平,因为我使用了这么大的角度公差 window。这是一个可调参数,具体取决于您希望达到目标角度的精确程度。