Python版本是Python3.7.3,OpenCV版本OpenCV.3.4.1,开发环境为PyCharm

本节将通过实例来介绍如何使用函数cv2.Sobel()获取图像边缘信息。

eg1:使用函数cv2.Sobel()获取图像水平方向的边缘信息。
在本例中,将参数ddepth的值设置为-1,参数dx和dy的值设置为“dx=1, dy=0”。
:程序如下:

import cv2
o = cv2.imread('sobel4.bmp',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(o,-1,1,0)
cv2.imshow("original",o)
cv2.imshow("x",sobelx)
cv2.waitKey()
cv2.destroyAllWindows()

运行程序,结果如下图所示。

Opencv python 模板匹配 opencv sobel python_取绝对值

Opencv python 模板匹配 opencv sobel python_取绝对值_02

【分析】从程序可以看出,当参数ddepth的值为-1时,只得到了图中黑色框的右边界。这是因为,左边界在运算时得到了负值,其在显示时被调整为0,所以没有显示出来。要想获取左边界的值(将其显示出来),必须将参数ddepth的值设置为更大范围的数据结构类型,并将其映射到8位图像内。

eg2:使用函数cv2.Sobel()获取图像水平方向的完整边缘信息。
在本例中,将参数ddepth的值设置为cv2.CV_64F,并使用函数cv2.convertScaleAbs()对cv2.Sobel()的计算结果取绝对值。
:程序如下:

import cv2
o = cv2.imread('sobel4.bmp',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(o,cv2.CV_64F,1,0)
sobelx = cv2.convertScaleAbs(sobelx)   # 转回uint8  
cv2.imshow("original",o)
cv2.imshow("x",sobelx)
cv2.waitKey()
cv2.destroyAllWindows()

运行程序,结果如下图所示。

Opencv python 模板匹配 opencv sobel python_取绝对值_03

Opencv python 模板匹配 opencv sobel python_图像处理_04


【分析】从程序可以看出,将函数cv2.Sobel()内参数ddepth的值设置为“cv2.CV_64F”,参数dx和dy的值设置为“dx=1, dy=0”后,执行该函数,再对该函数的结果计算绝对值,可以获取图像在水平方向的完整边缘信息。

eg3:使用函数cv2.Sobel()获取图像垂直方向的边缘信息。
在本例中,将参数ddepth的值设置为cv2.CV_64F,并使用函数cv2.convertScaleAbs()对cv2.Sobel()的计算结果取绝对值。
程序如下:

import cv2
o = cv2.imread('sobel4.bmp',cv2.IMREAD_GRAYSCALE)
sobely = cv2.Sobel(o,cv2.CV_64F,0,1)
sobely = cv2.convertScaleAbs(sobely)
cv2.imshow("original",o)
cv2.imshow("y",sobely)
cv2.waitKey()
cv2.destroyAllWindows()

运行程序,结果如下图所示。

Opencv python 模板匹配 opencv sobel python_Python-OpenCV_05

Opencv python 模板匹配 opencv sobel python_Sobel函数使用_06


【分析】从程序可以看出,将参数ddepth的值设置为“cv2.CV_64F”,参数dx和dy的值设置为“dx=0, dy=1”的情况下,使用函数cv2.convertScaleAbs()对函数cv2.Sobel()的计算结果取绝对值,可以获取图像在垂直方向的完整边缘信息。

eg4:当参数dx和dy的值为“dx=1, dy=1”时,查看函数cv2.Sobel()的执行效果。
程序如下:

import cv2
o = cv2.imread('sobel4.bmp',cv2.IMREAD_GRAYSCALE)
sobelxy=cv2.Sobel(o,cv2.CV_64F,1,1)
sobelxy=cv2.convertScaleAbs(sobelxy) 
cv2.imshow("original",o)
cv2.imshow("xy",sobelxy)
cv2.waitKey()
cv2.destroyAllWindows()

运行程序,结果如下图所示。

Opencv python 模板匹配 opencv sobel python_Sobel函数使用_07

Opencv python 模板匹配 opencv sobel python_Sobel函数使用_08


eg5:计算函数cv2.Sobel()在水平、垂直两个方向叠加的边缘信息。

程序如下:

import cv2
o = cv2.imread('sobel4.bmp',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(o,cv2.CV_64F,1,0)
sobely = cv2.Sobel(o,cv2.CV_64F,0,1)
sobelx = cv2.convertScaleAbs(sobelx)   # 转回uint8  
sobely = cv2.convertScaleAbs(sobely)  
sobelxy =  cv2.addWeighted(sobelx,0.5,sobely,0.5,0)  
cv2.imshow("original",o)
cv2.imshow("xy",sobelxy)
cv2.waitKey()
cv2.destroyAllWindows()

运行程序,结果如下图所示。

Opencv python 模板匹配 opencv sobel python_Sobel函数使用_09

Opencv python 模板匹配 opencv sobel python_Sobel函数使用_10


【分析】从程序可以看出,本例中首先分别计算x方向的边缘、y方向的边缘,接下来使用函数cv2.addWeighted()对两个方向的边缘进行叠加。在最终的叠加边缘结果中,同时显示两个方向的边缘信息。

eg6:使用不同方式处理图像在两个方向的边缘信息。
在本例中,分别使用两种不同的方式获取边缘信息。
● 方式1:分别使用“dx=1, dy=0”和“dx=0, dy=1”计算图像在水平方向和垂直方向的边缘信息,然后将二者相加,构成两个方向的边缘信息。
● 方式2:将参数dx和dy的值设为“dx=1, dy=1”,获取图像在两个方向的梯度。
程序如下:

import cv2
o = cv2.imread('lena.bmp',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(o,cv2.CV_64F,1,0)
sobely = cv2.Sobel(o,cv2.CV_64F,0,1)
sobelx = cv2.convertScaleAbs(sobelx)   # 转回uint8  
sobely = cv2.convertScaleAbs(sobely)  
sobelxy =  cv2.addWeighted(sobelx,0.5,sobely,0.5,0)  
sobelxy11=cv2.Sobel(o,cv2.CV_64F,1,1)
sobelxy11=cv2.convertScaleAbs(sobelxy11) 
cv2.imshow("original",o)
cv2.imshow("xy",sobelxy)
cv2.imshow("xy11",sobelxy11)
cv2.waitKey()
cv2.destroyAllWindows()

运行程序,结果如下图所示,其中左图为原始图像,中间的图为方式1对应的图像,右图为方式2对应的图像。

Opencv python 模板匹配 opencv sobel python_Python-OpenCV_11

Opencv python 模板匹配 opencv sobel python_图像处理_12

Opencv python 模板匹配 opencv sobel python_Opencv python 模板匹配_13