本示例使用的OpenCV版本是:OpenCV 4.1.1
运行Python的编辑器:Jupyter notebook 6.0.0
实现目的
您将学习如何使用使用索伯算子(Sobel operator)检测边缘(梯度的近似值)。
实现代码
1,以灰度读取图片,并显示原图
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('dog.png',0)
plt.imshow(img, cmap='gray')
2,使用索伯算子(Sobel operator)计算梯度近似值
dx = cv2.Sobel(img, cv2.CV_32F, 1, 0)
dy = cv2.Sobel(img, cv2.CV_32F, 0, 1)
3,显示结果
plt.figure(figsize=(10,10))
plt.subplot(131)
plt.axis('off')
plt.title('image')
plt.imshow(img, cmap='gray')
plt.subplot(132)
plt.axis('off')
plt.imshow(dx, cmap='gray')
plt.title(r'$\frac{dI}{dx}$')
plt.subplot(133)
plt.axis('off')
plt.title(r'$\frac{dI}{dy}$')
plt.imshow(dy, cmap='gray')
plt.tight_layout()
plt.show()
使用的示例图像计算出来的边缘并不明显,伙伴们可以试试其他图片。
可以看出dx的图像有点凹进去,而dy的图片有点凸出,难道这样就是浮雕滤镜?
程序说明
本示例,主要使用了 cv2.Sobe
函数计算梯度(边缘),实际上您可以精确地指定需要计算什么导数、应该使用什么内核以及输出图像的数据类型。具体用法请参考:
https://docs.opencv.org/4.1.1/d4/d86/group__imgproc__filter.html#gacea54f142e81b6758cb6f375ce782c8d
在显示结果中,请留意:
plt.subplot
函数声明了一行三列的布局,plt.figure
定义的显示的尺寸大小,plt.axis
的off定义了不显示坐标轴,plt.title
定义了图像标题