索贝尔算子(Sobeloperator)主要用于获得数字图像的一阶梯度,是一种离散性差分算子。它是prewitt算子的改进形式,改进之处在于sobel算子认为,邻域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的影响也不同。一般来说,距离越远,产生的影响越小。

       图像处理中认为,灰度值变化剧烈的地方就是边缘。那么如何判断灰度值变化?如何度量“剧烈”?sobel算子就对这些问题做了自己的规范,而且命名为sobel算子,就是对一副图像的输入到输出边缘信息的整个处理过程。

       sobel算子的思想,Sobel算子认为,邻域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的影响也不同。一般来说,距离越远,产生的影响越小。

       sobel算子的原理,对传进来的图像像素做卷积,卷积的实质是在求梯度值,或者说给了一个加权平均,其中权值就是所谓的卷积核;然后对生成的新像素灰度值做阈值运算,以此来确定边缘信息。

      卷积核和算法实现原理:

x方向的梯度会加强图像水平方向的特征,而y方向的梯度会加强图像竖直方向的特征

以下图为例,求Gx梯度时右边的像素减左边的像素,水平的相同像素会变为零,从而减弱了,垂直方向的像素 +x - (-1x)减去时负负得正变大了,从而加强了竖直方向的图像特征

matlab

clc

Gx=[-1.0 0.0 1.0;-2.0 0.0 2.0;-1.0 0.0 1.0];
Gy=[1.0 2.0 1.0;0.0 0.0 0.0;-1.0 -2.0 -1.0];

 
img=imread('VHlines.jpg');
image=rgb2gray(img);
 
subplot(2,2,1);  
% imshow(image);   
mesh(image);
title('原图'); 

gradx = conv2(Gx, image, 'full');
gradx = abs(gradx);
subplot(2,2,2);
imshow(gradx, []);
title('图像的sobel垂直梯度');

gradx = conv2( Gx, image, 'full');
gradx = abs(gradx);
subplot(2,2,3);
mesh(gradx);
title('图像的sobel垂直梯度');



grady=conv2(Gy,image,'full'); 
grady=abs(grady); %计算图像的sobel水平梯度 
subplot(2,2,4); 
% mesh(grady);
imshow(grady,[]); 
title('图像的sobel水平梯度');

gradx的像素值如下  

grady的像素值如下  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐