Sobel算子

Sobel算子是计算机视觉领域的一种重要处理方法。主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检测。在技术上,它是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度之近似值。在图像的任何一点使用此算子,将会产生该点对应的梯度矢量或是其法矢量。

核心公式

该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘检测的图像,其公式如下:
$$Gx=
\begin{bmatrix}
-1 & 0 & 1 \\
-2 & 0 & 2 \\
-1 & 0 & 1 \\
\end{bmatrix} $$

$$Gy=
\begin{bmatrix}
-1 & -2 & -1 \\
0 & 0 & 0 \\
1 & 2 & 1 \\
\end{bmatrix} $$

图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合,来计算梯度的大小。
$$G=\sqrt{Gx^2+Gy^2}$$

然后可用以下公式计算梯度方向。 $$ \Theta = arctan(\frac{Gy}{Gx})$$
在以上例子中,如果以上的角度Θ等于零,即代表图像该处拥有纵向边缘,左方较右方暗。

测试代码

sobel.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function [out,grad] = sobel( in ,mode)
[m,n,c]=size(in);
if(c==3)
in=rgb2gray(in);
end
out=zeros(m,n);
grad=zeros(m,n);
in=im2double(in);
for y =2:m-1
for x =2:n-1
dx=in(y-1,x+1)-in(y-1,x-1)+2*(in(y,x+1)-in(y,x-1))+in(y+1,x+1)-in(y+1,x-1);
dy=in(y+1,x-1)-in(y-1,x-1)+2*(in(y+1,x)-in(y-1,x))+in(y+1,x+1)-in(y-1,x+1);
grad(y,x)=atan(dy/dx);
if(mode==0)
out(y,x)=sqrt(dx*dx+dy*dy);
elseif(mode==1)
out(y,x)=abs(dx*dx)+abs(dy*dy);
end
end
end
end

test.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
close all;
clear;
img=imread('lena.jpg');
subplot(2,2,1);
imshow(img);
subplot(2,2,2);
imshow(sobel(img,0));
subplot(2,2,3);
[res,grad]=sobel(img,1);
imshow(res);

结果

坚持原创技术分享,您的支持将鼓励我继续创作!