初识OpenCV-Python - 009: 图像梯度

落爺英雄遲暮 提交于 2019-12-10 12:03:38

本节学习找到图像的梯度和边界。只要用到的函数为: cv2.Sobel(), cv2.Scharr(), cv2.Laplacian()

1. Laplacian 和 Sobel的对比

import cv2from matplotlib import pyplot as pltimg = 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的ksizesobely = 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 cv2import numpy as npfrom matplotlib import pyplot as pltimg = cv2.imread('box.png',0)
#8U,如果是以黑白片过度为正斜率(为正直),以白黑片过度为负斜率(为负值),如果再使用uint8,那么负斜率都会被置为0sobelx8u = 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()

 


 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!