13-opencv-python-图像梯度

目录

一、Sobel算子和Scharr算子

二、laplacian算子


图像梯度的原理:求导

Opencv提供了三种不同梯度的滤波器,或者说高通滤波器:Sobel,Scharr和Laplacian。

Sobel和Scharr是求一阶或二阶导数。Scharr是对Sobel(使用小的卷积核的优化),Laplacian是求二阶导数

一、Sobel算子和Scharr算子

Sobel算子是高斯平滑与微分操作的结合体,ta的抗噪音能力更好。可以设定求导的方向(xorder、yorder)还可以设定使用的卷积核的大小(ksize),如果ksize=-1,会使用3×3的Scharr滤波器,效果会更好,若速度相同,在使用3×3滤波器时候尽量使用Schaar

3×3的Schaar滤波器卷积核如下:

x方向

-3 0 3
-10 0 10
-3 0 3

y方向

-3 -10 -3
0 0 0
3 10 3

二、laplacian算子

拉普拉斯算子可以使用二阶导数的形式定义

可假设其离散实现类似于Sobel导数,事实上Opencv在计算拉普拉斯算子时直接调用Sobel算子

拉普拉斯滤波器使用的卷积核:

使用以上三种滤波器对图片进行处理,卷积核使用5×5:

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

img = cv2.imread('flower.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(221),plt.imshow(img,'gray'),plt.title('original')
plt.subplot(222),plt.imshow(laplacian,'gray'),plt.title('laplacian')
plt.subplot(223),plt.imshow(sobelx,'gray'),plt.title('sobelx')
plt.subplot(224),plt.imshow(sobely,'gray'),plt.title('sobely')

plt.show()

13-opencv-python-图像梯度_第1张图片

注意一下:我们可以通过设定参数-1来设定输出图像的深度(数据类型)与原图像保持一致,但是我们在代码中使用的是使用的确实cv2.CV_64F。在这里,想想一下,从黑到白的边界的导数是正数,那么从白到黑的边界的导数却是负数。如果原图像的深度是np.int8,所有的负值都被截断变为0。如果我们两种边界都想要检测到,最好的办法就是将输出的数据类型设置的更高,比如cv2.CV_16S等,取绝对值,然后再把它转回到cv2.CV_8U。

OK我们需要好好的了解一下这个参数:

参数含义:CV_(S|U|F)C 

  • bit_depth 比特数:代表8bite、16bites、32bites、64bites。举个例子吧,比如说,如果你现在创建了一个存储,灰度图片的Mat对象,这个图像的大小为宽100,高100,那么,现在这张灰度图片中有10000个像素点,它每一个像素点在内存空间所占的空间大小是8bite,8位,所以它对应的就是CV_8。

  • S|U|F:S--代表---signed int---有符号整形;U--代表--unsigned int--无符号整形;F--代表--float---------单精度浮点型

  • C 一张图片的通道数: 1--灰度图片--单通道图像; 2--RGB彩色图像--3通道图像;3--带Alph通道的RGB图像--4通道图像

 

 

 

 

 

 

 

你可能感兴趣的:(#,Opencv-python,opencv,计算机视觉,边缘检测)