凌顺
凌顺

目录

OpenCV Python 使用索伯算子(Sobel operator)检测边缘

本示例使用的OpenCV版本是:OpenCV 4.1.1
运行Python的编辑器:Jupyter notebook 6.0.0

实现目的

您将学习如何使用使用索伯算子(Sobel operator)检测边缘(梯度的近似值)。

file

实现代码

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的图片有点凸出,难道这样就是浮雕滤镜?

file

程序说明

本示例,主要使用了 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 定义了图像标题