您的位置:首页 > 编程语言 > Python开发

python OpenCV学习笔记(十三):图片梯度

2018-02-01 13:20 666 查看
官方文档 – https://docs.opencv.org/3.4.0/d5/d0f/tutorial_py_gradients.html

(不是很理解)

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

Sobel和Scharr派生物

Sobel算子是联合高斯平滑加微分运算,所以它对噪音更有抵抗力。您可以指定要采取的派生的方向,垂直的或水平的(参数xorder和yorder)。你也可以通过参数ksize来指定内核大小。如果ksize=-1,则使用3x3 Scharr过滤器,这比3x3 Sobel的过滤效果更好。

Laplacian派生物

计算由关系给出的图像的拉普拉斯算子。

中每个导数都是用Sobel导数找到的。 如果ksize=-1,则使用以下内核



示例

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

img = cv.imread('dave.jpg', 0)

laplacian = cv.Laplacian(img, cv.CF_64F)
sobelx = cv.Sobel(img, cv.CV_64F, 1, 0, ksize=5)
sobely = cv.Sobel(img, cv.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()




一个重要的问题!

在下一个例子中,我们的输出图片数据类型是cv.CV_8U或者np.uint8。这样有一个问题。黑-白过渡被视为正斜率(它有一个正的值),而白到黑的过渡被视为负的斜率(它有负的值)。当你把数据转换成np.uint8时。所有的负斜率都为零。简而言之,你错过了这条边。

如果您想要检测这两个边,更好的选择是将输出数据类型保持到更高的形式,比如cv。cv.CV_16S, cv.CV_64F等,取其绝对值,然后再转换回cv.CV_8U。

import numpy as np
import cv2 as cv
from matplot import pyplot as plt

img = cv.imread('box.png', 0)

# 输出的数据类型为cv.CV_8U
sobelx8u = cv.Sobel(img, cv.CV_8U, 1, 0, ksize=5)

# 输出的数据类型为cv.CV_64F。然后取绝对值,并转换回cv.CV_8U
sobelx64f = cv.Sobel(img, cv.CV_64F, 1, 0, ksize=5)
abs_sobelx64f = 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()




cv.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]]   )


函数被调用(xorder=1、yorder=0、ksize=3)或(xorder=0、yorder=1、ksize=3)来计算第一个x-或y-图像的导数

前者内核:


后者内核:


cv.Scharr(src, ddepth, dx, dy[, dst[, scale[, delta[, borderType]]]])


Scharr(src, dst, ddepth, dx, dy, scale, delta, borderType)


等价于

Sobel(src, dst, ddepth, dx, dy, CV\_SCHARR, scale, delta, borderType).


cv.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])


当k==1时,Laplacian的计算方法是用以下3x3孔径过滤图像:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OpenCV