本节学习找到图像的梯度和边界。只要用到的函数为: cv2.Sobel(), cv2.Scharr(), cv2.Laplacian()
1. Laplacian 和 Sobel的对比
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('dave.png',0)
#Laplcatician 导数计算图像的拉普拉斯变换,其中每个导数都使用Sobel导数
laplacian = cv2.Laplacian(img,cv2.CV_64F)
/**
sobel 是高斯平滑加微分的联合运算,对噪声有较强的抵抗能力。
可以指定倒数方向(垂直和水平)。
如果ksize=-1, 则是3*3的Scharr滤波器,其结果优于3*3的sobel滤波器。
**/
sobelx = cv2.Sobel(img, cv2.CV_64F, 1,0, ksize=5) #5*5的ksize
sobely = cv2.Sobel(img, cv2.CV_64F, 0,1, ksize=5)
plt.subplot(2,2,1), plt.imshow(img,cmap='gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,2), plt.imshow(laplacian,cmap='gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,3), plt.imshow(sobelx,cmap='gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,4), plt.imshow(sobely,cmap='gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.show()
2. 使用16S和64F得到两边的边界
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('box.png',0)
#8U,如果是以黑白片过度为正斜率(为正直),以白黑片过度为负斜率(为负值),如果再使用uint8,那么负斜率都会被置为0
sobelx8u = cv2.Sobel(img, cv2.CV_8U, 1,0, ksize=5)
sobelx64f = cv2.Sobel(img, cv2.CV_64F, 1,0,ksize=5) #该方法能更好的得到两边的边界
abs_sobel64f = np.absolute(sobelx64f)
sobel_8u = np.uint8(abs_sobel64f)
plt.subplot(1,3,1),plt.imshow(img,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(1,3,2),plt.imshow(sobelx8u,cmap = 'gray')
plt.title('Sobel CV_8U'), plt.xticks([]), plt.yticks([])
plt.subplot(1,3,3),plt.imshow(sobel_8u,cmap = 'gray')
plt.title('Sobel abs(CV_64F)'), plt.xticks([]), plt.yticks([])
plt.show()