用Python+OpenCV进行图像梯度操作

图像的梯度

对于梯度,首先要了解的是他是一个向量,所以它是既有 方向又有 大小的物理量。

对于二维图像的梯度,它的物理意义是:图像上各个pixel点灰度变化大小的衡量。图像梯度的最重要性质是,梯度的方向在图像灰度最大变化率上,它恰好可以反映出图像边缘上的灰度变化。

由于现在的数码图像都是离散数字量,所以图像的梯度可以通过对其两个方向上分别求导来获得,一般最简单的计算方法可以如下(当然还有其他更复杂的求法):

G(x,y) = dx i + dy j; 
dx(i,j) = I(i+1,j) - I(i,j); 
dy(i,j) = I(i,j+1) - I(i,j); 


Sobel算子

sobel算子中文名为索贝尔算子,是图像的一阶梯度算子,它的主要作用是对图像做边缘检测。对于一个3x3的矩形框内,soble算子的计算公式为:

3x3矩形框

Gy = (P7+2*P8+P9)-(P1+2*P2+P3)
Gx = (P7+2*P8+P9)-(P1+2*P2+P3)
|G| = |Gx| +|Gy|


sobel算子对比普通的一阶求导方法会复杂些,从单向计算变成了双向计算,从一条线上的计算变成了一个面上的计算,这样可以认为是一种差分操作,因此它的抗噪声能力是更好的。

对sobel算子的理解,有网友做比较好的总结:http://blog.csdn.net/yanmy2012/article/details/8110316

用python+openCV代码如下:

1
outimg = cv2.Sobel(img_gray,cv2.CV_64F,0,1,ksize=3)

测试图片结果如下:

sobel算子

Compartir