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导数找到的。 如果ksize=-1,则使用以下内核
示例
如果您想要检测这两个边,更好的选择是将输出数据类型保持到更高的形式,比如cv。cv.CV_16S, cv.CV_64F等,取其绝对值,然后再转换回cv.CV_8U。
函数被调用(xorder=1、yorder=0、ksize=3)或(xorder=0、yorder=1、ksize=3)来计算第一个x-或y-图像的导数
前者内核:
后者内核:
等价于
当k==1时,Laplacian的计算方法是用以下3x3孔径过滤图像:
(不是很理解)
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孔径过滤图像:
相关文章推荐
- python opencv入门(学习笔记no.1)-图片的读入读出
- Python OpenCV学习笔记之:通过图像金字塔方式缩小放大图片
- python OpenCV学习笔记(九):图片的几何变形
- python OpenCV学习笔记(七):图片的算术运算
- opencv-python 学习笔记1:简单的图片处理
- opencv_python学习笔记十三
- opencv_python学习笔记十三
- python OpenCV学习笔记(六):图片的基本操作
- python3.6.3+opencv3.3.0学习笔记十三--基于HOG的动态人体捕获
- Python OpenCV学习笔记之:图像梯度处理:Laplacian,Sobel算子
- opencv-python 学习笔记1:简单的图片处理
- python OpenCV学习笔记(十):图片阈值
- opencv-python 学习笔记1:简单的图片处理
- openCV Python学习笔记(一)图片的读入,显示与保存
- opencv-python 学习笔记1:简单的图片处理
- Python OpenCV学习笔记之:判断OpenCV是否已经打开优化功能
- OpenCV python 学习笔记(四)
- Python OpenCV学习笔记之:图像读取,显示及保存
- opencv_python学习笔记十
- opencv python 学习笔记(1)