图像梯度处理
图像计算的是图像的边缘信息,它能反映图像像素的变化。如灰度值变化较大的地方,梯度值也较大;灰度值较小的地方,相应的梯度值较小。图像梯度就是指像素的已接到是。图像的边缘是指灰度值发生急剧变化的地方,边缘检测目的就是在不破坏图像信息的条件下,减少图像的数据量,绘制其边缘线图。
Sobel算子
Opencv中提供l了cv2.Sobel()函数
1 | dst = cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]]) |
前四个是必须的参数:
src:需要处理的图像;
ddpteh:是图像的深度,-1表示采用的是与原图像相同的深度。目标图像的深度 必须大于等于原图像的深度;
dx和dy表示的是求导的阶数,0表示这个方向上没有求导,一般为0、1、2。
可选的参数:
dst:目标图像
ksize:Sobel算子的大小,必须为1、3、5、7。
scale:是缩放导数的比例常数,默认情况下没有伸缩系数;
delta:是一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中;
borderType:判断图像边界的模式。这个参数默认值cv2.BORDER_DEFAULT。
图像深度参数
ddpteh这个参数代表dst图像的深度,可选的参数如CV_16S、CV_32F、CV_64F等。
由于Sobel算子计算的是差分,有正有负,并且可能存在超过255的数,因此如果采用8为深度的话,显示图像会有问题。
计算水平方向偏导数的近似值

1 | import cv2 |

计算垂直方向偏导数的近似值

1 | # 图像梯度-Sobel算子 下-上 |

Scharr算子
Scharr算子可被视为Sobel算子的改进,具有Sobel算子相同的计算速度,但是其精度更高。
水平X:

数值Y:

使用
1 | panda_scharrx = cv2.Scharr(panda, cv2.CV_64F, 1, 0) |
Laplacian算子
Laplacian算子是一种二姐导数算子,具有旋转不变性,可以满足不同方向上的边缘检测要求。
使用
1 | car = cv2.imread('./images/car.png') |
