python+opencv-15 图像梯度与边缘检测
图像梯度与边缘检测
图像梯度是一种描述图像像素之间差异的方法,可以作为图像的一种特征来表征图像。图像梯度计算的是图像的边缘信息,它能够反应图像像素变化的速度,如灰度值变化较大的地方,梯度值也较大。图像梯度就是指像素的一阶导数,在图像处理中可以通过计算像素值的差近似导数值。图像边缘是指灰度值发生急剧变化的地方,边缘检测的目的是在不破坏图像信息的条件下,减少图像的数据量,绘制出其边缘线图。
Soble算子
Soble算子一种离散型差分算子,用来运算图像灰度函数的梯度的近似值。Soble算子是典型的基于一阶导数的边缘监测算子,由于该算子中引入了类似局部平均的运算,因此对噪声具有平滑作用,能很好的消除噪声影响。
Soble算子包含两组 3 ∗ 3 3*3 3∗3的矩阵,分别为横向及纵向模板,将之与图像进行平面卷积,即可分别得出横向及纵向的灰度差分近似值。
Soble算子的水平方向的模板为: G x = [ − 1 0 1 − 2 0 2 − 1 0 1 ] × s r c {
{G}_{x}}=\left[ \begin{matrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \\ \end{matrix} \right]\times src Gx=⎣⎡−1−2−1000121⎦⎤×src
Soble算子的垂直方向的模板为: G y = [ − 1 − 2 − 1 0 0 0 1 2 1 ] × s r c {
{G}_{y}}=\left[ \begin{matrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \\ \end{matrix} \right]\times src Gy=⎣⎡−101−202−101⎦⎤×src
import cv2 as cv
image = cv.imread("lena.jpg", 0)
Sobelx = cv.Sobel(image, cv.CV_64F, 1, 0)
Sobelx = cv.convertScaleAbs(Sobelx)
Sobely = cv.Sobel(image, cv.CV_64F, 0, 1)
Sobely = cv.convertScaleAbs(Sobely)
Sobelxy = cv.Sobel(image, cv.CV_64F, 1, 1)
Sobelxy = cv.convertScaleAbs(Sobelxy)
Sobelxy_my = cv.addWeighted(Sobelx, 0.5, Sobely, 0.3, 0)
cv.imshow("image", image)
cv.imshow("Sobelx", Sobelx)
cv.imshow("Sobely", Sobely)
cv.imshow("Sobelxy", Sobelxy)
cv.imshow("Sobelxy_my", Sobelxy_my)
cv.waitKey()
cv.destroyAllWindows()
Scharr算子
Scharr算子可被视为Sobel算子的改进,具有与Sobel算子相同的计算速度,但是其精度更高。
Scharr算子由两个卷积核构成,且这两个卷积核不可分离。图像与水平方向的卷积运算反应垂直方向上的边缘强度,图像与垂直方向的卷积运算反应水平方向上的边缘强度。
s c h a r r x = [