OpenCV学习笔记13-图像梯度

来源:互联网 发布:小米打开数据无法上网 编辑:程序博客网 时间:2024/06/06 00:34

OpenCV 提供了三种高通滤波器:Sobel, Scharr, Laplacian


import numpy as npimport cv2from matplotlib import pyplot as pltimg = cv2.imread('2.png', 0)#cv2.CV_64F为输出图像的深度(数据类型)。#可使用-1,表示与原图像保持一致(np.uint8),但容易丢失边界!laplacian = cv2.Laplacian(img, cv2.CV_64F)sobel_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)   #只在x方向求导,卷积核5*5sobel_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)   #只在y方向求导,卷积核5*5canny = cv2.Canny(img, 100, 200)plt.subplot(3,2,1), plt.imshow(img, cmap='gray'), plt.title('Original')plt.xticks([]), plt.yticks([])plt.subplot(3,2,2), plt.imshow(laplacian, cmap='gray'), plt.title('laplacian')plt.xticks([]), plt.yticks([])plt.subplot(3,2,3), plt.imshow(sobel_x, cmap='gray'), plt.title('sobel_x')plt.xticks([]), plt.yticks([])plt.subplot(3,2,4), plt.imshow(sobel_y, cmap='gray'), plt.title('sobel_y')plt.xticks([]), plt.yticks([])plt.subplot(3,2,5), plt.imshow(canny, cmap='gray'), plt.title('canny')plt.xticks([]), plt.yticks([])plt.show()

这里写图片描述


特别提醒:

输出图像的深度(数据类型)可以设置为-1,从而与原图像保持一致。但我们为什么使用cv2.CV_64F呢?

想象一个从黑到白的边界的导数是整数,而一个从白到黑的边界点导数却是负数。如果原图像的深度的数据类型是np.int8 时,所有的负值都会被截断变成 0,换句话说就是把把边界丢失掉。

所以如果这两种边界你都想检测到,最好的的办法就是将输出的深度的数据类型设置的更高,比如 cv2.CV_16S, cv2.CV_64F 等。取绝对值然后再把它转回到 cv2.CV_8U。

原创粉丝点击