OPENCV FOR PYTHON 学习笔记 - 图像梯度 Sobel算子

Sobel算子:是离散微分算子(discrete differentiation operator),用来计算图像灰度的近似梯度,梯度越大越有可能是边缘。

Sobel算子依然是一种过滤器,只是其是带有方向的。在OpenCV-Python中,使用Sobel的算子的函数原型如下:

dst = cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])

  前四个是必须的参数:

    第一个参数src:需要处理的图像;

    第二个参数ddepth:是图像的深度,-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度;

    第三个和第四个参数dx和dy:表示的是求导的阶数,0表示这个方向上没有求导,一般为0、1、2。

  其后是可选的参数:

    dst不用解释了;

    ksize是Sobel算子的大小,必须为1、3、5、7。

    scale是缩放导数的比例常数,默认情况下没有伸缩系数;

    delta是一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中;

    borderType是判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT。

在OpenCV-Python中,Sobel函数的使用如下:

import cv2 as cv

img = cv.imread("lena.jpg",cv.IMREAD_UNCHANGED)
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE)
cv.namedWindow("binary",cv.WINDOW_AUTOSIZE)
cv.imshow("binary",binary)

sobelx = cv.Sobel(binary,cv.CV_64F,1,0)
sobelx = cv.convertScaleAbs(sobelx)
cv.namedWindow("sobelx",cv.WINDOW_AUTOSIZE)
cv.imshow("sobelx",sobelx)

sobely = cv.Sobel(binary,cv.CV_64F,0,1)
sobely = cv.convertScaleAbs(sobely)
cv.namedWindow("sobely",cv.WINDOW_AUTOSIZE)
cv.imshow("sobely",sobely)

sobelxy = cv.addWeighted(sobelx,0.5,sobely,0.5,0)
cv.namedWindow("sobelxy",cv.WINDOW_AUTOSIZE)
cv.imshow("sobelxy",sobelxy)

cv.waitKey(0)
cv.destroyAllWindows()

在Sobel函数的第二个参数这里使用了cv2.CV_16S。因为OpenCV文档中对Sobel算子的介绍中有这么一句:“in the case of 8-bit input images it will result in truncated derivatives”。即

Sobel函数求完导数后会有负值,还有会大于255的值。而原图像是uint8,即8位无符号数,所以Sobel建立的图像位数不够,会有截断。因此要使用16位有符号的数据类型,即

cv2.CV_16S。

在经过处理后,别忘了用convertScaleAbs()函数将其转回原来的uint8形式。否则将无法显示图像,而只是一副灰色的窗口。

convertScaleAbs()的原型为:

dst = cv2.convertScaleAbs(src[, dst[, alpha[, beta]]])
其中alpha是第一幅图片中元素的权重,beta是第二个的权重,gamma是加到最后结果上的一个值。

 

posted @ 2021-08-19 16:37  HappyChen2016  阅读(146)  评论(0编辑  收藏  举报