输入图像深度 | 输出图像深度 |
---|---|
cv2.CV_8U | -1/cv2.CV_16S/cv2.CV_32F/cv2/CV_64F |
cv2.CV_16U/cv2.CV_16S | -1/cv2.CV_32F/cv2.CV_64F |
cv2.CV_32F | -1/cv2.CV_32F/cv2.CV_64F |
cv2.CV_64F | -1/cv2.CV_64F |
dx:代表X方向的求导阶数
dy:代表Y方向的求导阶数
ksize:Sobel核的大小,该值为-1时,则会使用Sobel滤波器进行运算
scale:计算导数值所采用的缩放因子,默认值为1,时没有缩放的
delta:加载目标图像上的值,该值可选,默认为0
borderType:边界样式,前面博文有详细介绍,这里不在赘述。
需要注意的是,如果将ddepth参数设置为-1,让处理结果与原图像保持一致,可以会得到错误的结果。实际上,这么做会导致梯度值可能出现负数。如果处理的是8位图像,意味着指定运算的结果也是8位图类型,那么所有的负数会自动截断为0,发生信息丢失。为了避免信息丢失,在计算时先使用更高的数据类型cv2.CV_64F,再通过取绝对值将其映射为cv2.CV_8U类型。所以,我们使用Sobel滤波器常常会将ddepth设置为cv2.CV_64F。
计算X方向梯度语法格式为:
cv2.Sobel(src,ddepth,1,0)
计算Y方向梯度语法格式为:
cv2.Sobel(src,ddepth,0,1)
计算XY方向梯度语法格式为:
cv2.Sobel(src,ddepth,1,1)
计算XY叠加梯度语法格式为:
dx=cv2.Sobel(src,ddepth,1,0) dy=cv2.Sobel(src,ddepth,0,1) dst=cv2.addWeighted(src1,alpha,src2,beta,gamma)
因为可能会出现负数,我们还需要使用另一个函数取绝对值,该函数为:cv2.convertScaleAbs(),其完整定义如下:
def convertScaleAbs(src, dst=None, alpha=None, beta=None):
alpha:调节系数,可选值,默认为1
beta:调节亮度值,默认为0
下面,我们来使用Sobel滤波器,获取图像水平方向的边缘信息,代码如下:
import cv2 img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED) sobel_x=cv2.Sobel(img,cv2.CV_64F,1,0) result=cv2.convertScaleAbs(sobel_x) cv2.imshow("img", img) cv2.imshow("result", result) cv2.waitKey() cv2.destroyAllWindows()
运行之后,效果如下所示:
接着,我们来使用Sobel滤波器,获取图像垂直方向的边缘信息,代码如下:
import cv2 img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED) sobel_y=cv2.Sobel(img,cv2.CV_64F,0,1)#更改这一行就行 result=cv2.convertScaleAbs(sobel_y) cv2.imshow("img", img) cv2.imshow("result", result) cv2.waitKey() cv2.destroyAllWindows()
运行之后,效果如下:
接着,我们来计算XY方向梯度,代码如下:
import cv2 img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED) sobel_xy=cv2.Sobel(img,cv2.CV_64F,1,1)#都设置为1 result=cv2.convertScaleAbs(sobel_xy) cv2.imshow("img", img) cv2.imshow("result", result) cv2.waitKey() cv2.destroyAllWindows()
运行之后,效果如下:
最后,我们来计算其水平垂直两个方向的叠加边缘信息,代码如下:
import cv2 img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED) sobel_x=cv2.Sobel(img,cv2.CV_64F,1,0) sobel_y=cv2.Sobel(img,cv2.CV_64F,0,1) abx_x=cv2.convertScaleAbs(sobel_x) abx_y=cv2.convertScaleAbs(sobel_y) result=cv2.addWeighted(sobel_x,0.5,sobel_y,0.5,0) cv2.imshow("img", img) cv2.imshow("result", result) cv2.waitKey() cv2.destroyAllWindows()
运行之后,效果如下:
到此这篇关于OpenCV-Python实现图像梯度与Sobel滤波器的文章就介绍到这了,更多相关OpenCV 图像梯度与Sobel滤波器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!