使用cv2.Sobel()cv2.Scharr()cv2.Laplacian()寻找图像的梯度边缘

Posted 程序媛一枚~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用cv2.Sobel()cv2.Scharr()cv2.Laplacian()寻找图像的梯度边缘相关的知识,希望对你有一定的参考价值。

Python,OpenCV寻找图像的梯度、边缘

这篇博客将介绍如何使用cv2.Sobel()、cv2.Scharr()、cv2.Laplacian()寻找图像的梯度、边缘;

  • OpenCV提供了三种类型的梯度滤波器或高通滤波器,Sobel、Scharr和Laplacian。
  • Sobel算子是一种联合高斯平滑加微分运算,它对噪声的抵抗能力更强。
  • Schaar的效果要比Sobel好一些

1. 效果图

原始图 VS 拉普拉斯 VS SobelX VS SobleY VS SchaarX VS SchaarY效果图如下:
在这里插入图片描述

2. 源码

# 使用cv2.Sobel()、cv2.Scharr()、cv2.Laplacian()寻找图像的梯度、边缘;
# OpenCV提供了三种类型的梯度滤波器或高通滤波器,Sobel、Scharr和Laplacian。
# Sobel算子是一种联合高斯平滑加微分运算,因此它对噪声的抵抗能力更强。
# Schaar的效果要比Sobel好一些
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('gw.jpg', 0)

laplacian = cv2.Laplacian(img, cv2.CV_64F)
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)

schaarx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=-1)
schaary = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=-1)

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(sobelx, cmap='gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(3, 2, 4), plt.imshow(sobely, cmap='gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.subplot(3, 2, 5), plt.imshow(schaarx, cmap='gray')
plt.title('Schaar Y'), plt.xticks([]), plt.yticks([])
plt.subplot(3, 2, 6), plt.imshow(schaary, cmap='gray')
plt.title('Schaar Y'), plt.xticks([]), plt.yticks([])

plt.show()

参考

以上是关于使用cv2.Sobel()cv2.Scharr()cv2.Laplacian()寻找图像的梯度边缘的主要内容,如果未能解决你的问题,请参考以下文章

图像梯度—SobelScharr和Laplacian算子

图像梯度—SobelScharr和Laplacian算子

局部处理的边缘连接(python+opencv)

Python+opencv利用sobel进行边缘检测(细节讲解)

OPEN CV系列二:图像处理

opencv 分水岭分割图像