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

opencv for python (15) 图像梯度(Sobel算子、scharr算子与laplacian算子原理及卷积模板)

2018-01-20 11:15 513 查看
Sobel算子、scharr算子与laplacian算子

Sobel算子是一阶导数的边缘检测算子,在算法实现过程中,通过3×3模板作为核与图像中的每个像素点做卷积和运算,然后选取合适的阈值以提取边缘。

采用3×3邻域可以避免在像素之间内插点上计算梯度。Sobel算子也是一种梯度幅值,即:



其中的偏导数Sx 和Sy可用卷积模板来实现。

Sx=(Z1+2Z2+Z3)-(Z7+2Z8+Z9)

Sy=(Z1+2Z4+Z7)-(Z3+2Z6+Z9)



Sobel算子算法的优点是计算简单,速度快。但是由于只采用了2个方向的模板,只能检测水平和垂直方向的边缘,因此这种算法对于纹理较为复杂的图像,其边缘检测效果就不是很理想。该算法认为:凡灰度新值大于或等于阈值的像素点时都是边缘点。这种判断欠合理,会造成边缘点的误判,因为许多噪声点的灰度值也很大。

scharr算子与Sobel的不同点是在平滑部分,这里所用的平滑算子是1/16∗[3,10,3],相比于1/4∗[1,2,1],中心元素占的权重更重,这可能是相对于图像这种随机性较强的信号,邻域相关性不大,所以邻域平滑应该使用相对较小的标准差的高斯函数,也就是更瘦高的模板

Laplacian 算子是n维欧几里德空间中的一个二阶微分算子,定义为梯度grad的散度div。可使用运算模板来运算这定理定律。



那为什么诸如此类的算子是如何得到的呢?(Roberts、Prewitt、Sobel、Lapacian算子)对原图像进行卷积,不过这里的模板并不是随便设计的,而是根据数学中求导理论推导出来的。下面就逐一分析各梯度算子的推导过程。

梯度与Roberts、Prewitt、Sobel、Lapacian算子

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

img = cv2.imread('nine.jpg',cv2.IMREAD_GRAYSCALE)
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)
plt.title('Original'),plt.xticks([]),plt.yticks([])
plt.subplot(222),plt.imshow(laplacian)
plt.title('laplacian'),plt.xticks([]),plt.yticks([])
plt.subplot(223),plt.imshow(sobelx)
plt.title('sobelx'),plt.xticks([]),plt.yticks([])
plt.subplot(224),plt.imshow(sobely)
plt.title('sobely'),plt.xticks([]),plt.yticks([])
plt.show()


在滤波函数第二个参数,当我们使用-1表示输出图像与输入图像的数据类型一致时,如果原始图像是uint8型的,那么在经过算子计算以后,得到的图像可能会有负值,如果与原图像数据类型一致,那么负值就会被截断变成0或者255,使得结果错误,那么针对这种问题有两种方式改变(上述程序中都有):一种就是改变输出图像的数据类型(第二个参数cv2.CV_64F),另一种就是改变原始图像的数据类型(此时第二个参数可以为-1,与原始图像一致)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐