使用 Prewitt、Scharr 和 Sobel 算子进行边缘检测
图像亮度的不连续性称为边缘。边缘检测是用于识别图像中图像亮度急剧变化的区域的技术。使用一阶导数,在图像直方图中的局部最小值或局部最大值处观察到强度值的这种急剧变化。
本文中使用的技术是一阶导数技术,即:
- 普维特算子
- 夏尔算子
- 索贝尔算子
普维特算子
Prewitt运算符由 Judith MS Prewitt 开发。 Prewitt运算符用于图像中的边缘检测。 Prewitt运算符检测两种类型的边,它们是:
- 水平边缘或沿 x 轴,
- 垂直边缘或沿 y 轴。
只要像素强度发生突然变化,掩码就会检测到边缘。由于边缘被定义为像素强度的变化,因此可以使用微分来计算。 Prewitt 掩码是一阶导数掩码。在 Prewitt-mask 结果的图形表示中,边由局部最大值或局部最小值表示。
一阶和二阶导数掩码都遵循以下三个属性:
- 更多的权重意味着更多的边缘检测。
- 面罩中应出现相反的标志。 (+ 和 -)
- 掩码值的总和必须等于零。
Prewitt运算符为我们提供了两个掩码,一个用于检测水平方向的边缘,另一个用于检测垂直方向的边缘。
Prewitt Operator [X-axis] = [ -1 0 1; -1 0 1; -1 0 1]
Prewitt Operator [Y-axis] = [1 1 1; 1 1 1; 1 1 1]
脚步:
- 阅读图像。
- 如果它是彩色的,则转换为灰度。
- 转换成双格式。
- 定义掩码或过滤器。
- 检测沿 X 轴的边缘。
- 检测沿 Y 轴的边缘。
- 组合沿 X 轴和 Y 轴检测到的边缘。
- 显示所有图像。
Imtool() is the inbuilt function in Matlab. It is used to display the image. It takes 2 parameters; the first is the image variable and the second is the range of intensity values. We provide an empty list as the second argument which means the complete range of intensity has to be used while displaying the image.
例子:
Matlab
% MATLAB code for prewitt
% operator edge detection
k=imread("logo.png");
k=rgb2gray(k);
k1=double(k);
p_msk=[-1 0 1; -1 0 1; -1 0 1];
kx=conv2(k1, p_msk, 'same');
ky=conv2(k1, p_msk', 'same');
ked=sqrt(kx.^2 + ky.^2);
% display the images.
imtool(k,[]);
% display the edge detection along x-axis.
imtool(abs(kx), []);
% display the edge detection along y-axis.
imtool(abs(ky),[]);
% display the full edge detection.
imtool(abs(ked),[]);
Matlab
%Scharr operator -> edge detection
k=imread("logo.png");
k=rgb2gray(k);
k1=double(k);
s_msk=[-3 0 3; -10 0 10; -3 0 3];
kx=conv2(k1, s_msk, 'same');
ky=conv2(k1, s_msk', 'same');
ked=sqrt(kx.^2 + ky.^2);
%display the images.
imtool(k,[]);
%display the edge detection along x-axis.
imtool(abs(kx), []);
%display the edge detection along y-axis.
imtool(abs(ky),[]);
%display the full edge detection.
imtool(abs(ked),[]);
Matlab
% MATLAB code for Sobel operator
% edge detection
k=imread("logo.png");
k=rgb2gray(k);
k1=double(k);
s_msk=[-1 0 1; -2 0 2; -1 0 1];
kx=conv2(k1, s_msk, 'same');
ky=conv2(k1, s_msk', 'same');
ked=sqrt(kx.^2 + ky.^2);
%display the images.
imtool(k,[]);
%display the edge detection along x-axis.
imtool(abs(kx), []);
%display the edge detection along y-axis.
imtool(abs(ky),[]);
%display the full edge detection.
imtool(abs(ked),[]);
输出:
夏尔算子
这是一种过滤方法,用于使用一阶导数识别和突出显示梯度边缘/特征。性能与 Sobel 过滤器非常相似。
Scharr Operator [X-axis] = [-3 0 3; -10 0 10; -3 0 3];
Scharr Operator [Y-axis] = [ 3 10 3; 0 0 0; -3 -10 -3];
例子:
MATLAB
%Scharr operator -> edge detection
k=imread("logo.png");
k=rgb2gray(k);
k1=double(k);
s_msk=[-3 0 3; -10 0 10; -3 0 3];
kx=conv2(k1, s_msk, 'same');
ky=conv2(k1, s_msk', 'same');
ked=sqrt(kx.^2 + ky.^2);
%display the images.
imtool(k,[]);
%display the edge detection along x-axis.
imtool(abs(kx), []);
%display the edge detection along y-axis.
imtool(abs(ky),[]);
%display the full edge detection.
imtool(abs(ked),[]);
输出:
索贝尔算子
它以欧文·索贝尔和加里·费尔德曼的名字命名。与 Prewitt运算符子一样,Sobel运算符也用于检测图像中的两种边缘:
- 垂直方向
- 水平方向
Sobel 和 Prewitt 算子的区别在于,在 Sobel运算符中,掩码的系数可以根据我们的要求进行调整,前提是它们遵循导数掩码的所有属性。
Sobel-X Operator = [-1 0 1; -2 0 2; -1 0 1]
Sobel-Y Operator = [-1 -2 -1; 0 0 0; 1 2 1]
例子:
MATLAB
% MATLAB code for Sobel operator
% edge detection
k=imread("logo.png");
k=rgb2gray(k);
k1=double(k);
s_msk=[-1 0 1; -2 0 2; -1 0 1];
kx=conv2(k1, s_msk, 'same');
ky=conv2(k1, s_msk', 'same');
ked=sqrt(kx.^2 + ky.^2);
%display the images.
imtool(k,[]);
%display the edge detection along x-axis.
imtool(abs(kx), []);
%display the edge detection along y-axis.
imtool(abs(ky),[]);
%display the full edge detection.
imtool(abs(ked),[]);
输出: