@fuxianjun
Soble
图像接度计算的是围像变化的速度,对于图像的边缘部分,其灰度值变化较大,棉度值也较大:相反对于限像中比较平滑的部分,其灰度值变化较小,相应的梯度值也权小,定低馆
严格来讲,图像梯度计算需要求导数,但是图像梯度一般通过计 算像素值的差来得到梯度的近似值(近似导数值)。
例如,图中的左右两幅图分别描述了图像的水平边界和垂直边界。
针对左图,通过垂直方向的线条A和线条B的位置,可以计算图像水平方向的边界:
●对于线条A和线条B,其右侧像素值与左侧像素值的差值不为零,因此是边界。
●对于其余列,其右侧像素值与左侧像素值的差值均为零,因此不是边界。
针对右图,通过水平方向的线条A和线条B的位置,可以计算图像垂直方向的边界:
●对于线条A和线条B,其下侧像素值与上侧像素值的差值不为零,因此是边界。
●对于其余行,其下侧像素值与上侧像素值的差值均为零,因此不是边界。
Soble算子及函数使用
在Opencv中,使用函数cv2.Sobel()实现Sobel算子运算,其语法形式为:
dst=cv2.Sobel(src,ddepth,dx,dy,[,ksize[,scale[,delta[,bordderYype]]]])式中:
●dst代表目标图像。
●src代表原始图像。
●ddepth代表输出图像的深度。其具体对应关系如表。
●dx代表x方向上的求导阶数。
●dy代表y方向上的求导阶数。
●ksize 代表Sobel核的大小。该值为-1时,则会使用Scharr算子进行运算。
●scale代表计算导数值时所采用的缩放因子,默认情况下该值是1,是没有缩放的。
●delta代表加载目标图像dst上的值,改值是可以选的,默认为0.
●borderType代表边界样式。该参数的具体类型及值如表。
编程实现计算peppa的sobel边缘
import cv2
import numpy as np
peppa = cv2.imread("peppa.png",0)
sobelx = cv2.Sobel(peppa,cv2.CV_64F,1,0)
sobelx=cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(peppa,cv2.CV_64F,1,0)
sobely=cv2.convertScaleAbs(sobely)
sobel_demo = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv2.imshow("sobel_demo",sobel_demo)
cv2.waitKey(0)
cv2.destroyAllWindows()
Scharr算子及函数使用:
在离散的空间上,有很多方法可以用来计算近似导数,在使用3x3的Sobel算子时,可能 计算结果并不太精准。OpenCV 提供了Schar 算子,该算子具有和Sobel算子同样的速度,且精度更高。可以将Scharr算子看作对Sobel算子的改进,其核通常为:
OpenCV提供了函数cv2.Scharr(来计算Scharr算子,其语法格式如下:
dst = cv2.Scharr( src, ddepth, dx, dy[, scale[, delta[, borderType]]] )
●dst代表目标图像。
●src代表原始图像。
●ddepth代表输出图像的深度。
●dx代表x方向上的求导阶数。
●dy代表y方向上的求导阶数。
●scale代表计算导数值时所采用的缩放因子,默认情况下该值是1,是没有缩放的。
●delta代表加载目标图像dst上的值,改值是可以选的,默认为0.
●borderType代表边界样式。该参数的具体类型及值如表。
Laplacian算子及函数使用
Laplacian (拉普拉斯)算子是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)的要求。通常情况下,其算子的系数之和需要为零。例如,一个3x3大小的Laplacian算子如图所示。
Laplacian算子类似二阶Sobel导数,需要计算两个方向的梯度值。例如,在图中:
●左图是Laplacian算子。
●右图是一个简单图像,其中有9个像素点。
计算像素点P5的近似导数值,如下:
P5lap=(P2 +P4+P6+ P8)-4*P5
图展示了像素点与周围点的一一些实例,其中:
●在左图中,像素点P5与周围像素点的值相差较小,得到的计算结果值较小,边缘不明显。
●在中间的图中,像素点P5与周围像素点的值相差较大,得到的计算结果值较大,边缘较明显。
●在右图中,像素点P5与周围像素点的值相差较大,得到的计算结果值较大,边缘较明显。
需要注意,在上述图像中,计算结果的值可能为正数,也可以为负数。所以,需要对计算结果取绝对值,以保证后续运算和显示都是正确的。
在OpenCV内使用函数cv2.Laplacian0实现I aplacian算子的计算,该函数的语法格式为: dst = cv2.Laplacian( src, ddepth[, ksize[, scale[, delta[, borderType]]]] )式中:
●dst代表目标图像。
●src代表原始图像。
●ddepth代表目标图像的深度。
●ksize代表用于计算二阶导数的核尺寸大小。该值必须是正的奇数。
●scale代表计算Laplacian值的缩放比例因子,该参数是可选的。默认情况下,该值为1,表示不进行缩放。
●delta 代表加到目标图像上的可选值,默认为0。
●borderType代表边界样式。