OpenCV学习笔记13-图像梯度

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


import numpy as np
import cv2
from matplotlib import pyplot as plt

img = 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*5
sobel_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)   #只在y方向求导,卷积核5*5
canny = 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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值