资讯专栏INFORMATION COLUMN

opencv python 图像梯度

mumumu / 1274人阅读

摘要:提供三种类型的梯度滤波器或高通滤波器,,和和导数算子是结合了高斯平滑与微分运算的结合方法,所以它的抗噪声能力很强用户可以设定求导方向,水平或者垂直通过参数和也可以指定卷积核大小,通过参数如果,那么一个的滤波器会被使用,该滤波器会得到比滤波

Image Gradients

OpenCV提供三种类型的梯度滤波器或高通滤波器,Sobel,Scharr和Laplacian.

1 Sobel 和 Scharr 导数

Sobel算子是结合了高斯平滑与微分运算的结合方法,所以它的抗噪声能力很强.

用户可以设定求导方向,水平或者垂直(通过参数yorder和xorder).也可以指定卷积核大小,通过参数ksize.如果ksize=-1,那么一个3*3的scharr滤波器会被使用,该滤波器会得到比Sobel滤波器更好的效果.

2

该方法计算了图像的拉普拉斯导数:

$$ Delta src = frac{partial ^2{src}}{partial x^2} + frac{partial ^2{src}}{partial y^2} $$

每个求导数的方法都是使用Sobel求导方法,如果ksize=1,那么会使用下面核函数进行滤波.

$$ kernel = egin{bmatrix} 0 & 1 & 0 1 & -4 & 1 0 & 1 & 0 end{bmatrix} $$

代码

import cv2
from matplotlib import pyplot as plt

img = cv2.imread("img.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)

plt.subplot(2,2,1),plt.imshow(img,cmap = "gray")
plt.title("Original"), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,2),plt.imshow(laplacian,cmap = "gray")
plt.title("Laplacian"), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,3),plt.imshow(sobelx,cmap = "gray")
plt.title("Sobel X"), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,4),plt.imshow(sobely,cmap = "gray")
plt.title("Sobel Y"), plt.xticks([]), plt.yticks([])

plt.show()

NOTE

在我们的上一个示例中,输出数据类型为cv.CV_8U或np.uint8.但是这有一个小问题.将黑到白转换视为正斜率(它具有正值),而将白到黑转换视为负斜率(它具有负值). 因此,当您将数据转换为np.uint8时,所有负斜率都为零.

如果想要两种边界都检测到,最高的办法就是将输出数据类型设置更高,cv2.CV_16S,cv2.CV_64F等等,然后取绝对值转换为cv2.CV_8.

代码

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

img = cv2.imread("img5.png",0)


# Output dtype = cv.CV_8U
sobelx8u = cv2.Sobel(img,cv2.CV_8U,1,0,ksize=5)

# Output dtype = cv.CV_64F. Then take its absolute and convert to cv.CV_8U
sobelx64f = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
abs_sobel64f = np.absolute(sobelx64f)
sobel_8u = np.uint8(abs_sobel64f)

plt.subplot(1,3,1),plt.imshow(img,cmap = "gray")
plt.title("Original"), plt.xticks([]), plt.yticks([])
plt.subplot(1,3,2),plt.imshow(sobelx8u,cmap = "gray")
plt.title("Sobel CV_8U"), plt.xticks([]), plt.yticks([])
plt.subplot(1,3,3),plt.imshow(sobel_8u,cmap = "gray")
plt.title("Sobel abs(CV_64F)"), plt.xticks([]), plt.yticks([])

plt.show()

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42009.html

相关文章

  • opencv python Canny边缘检测

    摘要:虽然边低于,但它连接到边,因此也被视为有效边,我们得到完整的曲线。但边缘虽然高于并且与边缘的区域相同,但它没有连接到任何真实边缘,因此被丢弃。 Canny Edge Detection Canny边缘检测是一种流行的边缘检测算法.它是由John F. Canny开发的, 这是一个多阶段算法. 减少噪音由于边缘检测易受图像中的噪声影响,因此第一步是使用5x5高斯滤波器去除图像中的噪...

    whinc 评论0 收藏0
  • 使用PythonOpenCV进行基本的图像处理——提取红色圆圈轮廓并绘制

    摘要:使用,进行基本的图像处理提取红色圆圈轮廓并绘制效果图源码写这篇博客源于博友的提问,想提取图片中的红色圆圈坐标,并绘制封闭的轮廓。还是使用一系列图像处理,得到了比较理想的结果。 ...

    Gu_Yan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<