一:图像梯度
1:sobel算子
https://blog.csdn.net/wzyaiwl/article/details/81274930
import cv2 as cv
import numpy as np
img1=cv.imread(“D:/OPen CV/pie.png”)
sobelx=cv.Sobel(img1,cv.CV_64F,1,0,ksize=5)
cv.imshow(“sobelx”,sobelx)
cv.waitKey(0)
cv.destroyAllWindows()
注意:各个参数
第一个参数是需要处理的图像;
第二个参数是图像的深度(数据类型),-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度;
dx和dy表示的是求导的阶数,0表示这个方向上没有求导,一般为0、1、2;
其后是可选的参数:
ksize是Sobel算子的大小,必须为1、3、5、7。如果ksize=-1,那么一个33的scharr滤波器会被使用;
delta是一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中;
borderType是判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT;
但是结果只出现一半的圆
白到黑是正数,黑到白是负数,所有的负数都会被截断为0,所以要取绝对值
sobelx=cv.convertScaleAbs(sobelx)
第一步:先求出sobelX的坐标:是1,0
sobelx=cv.Sobel(img1,cv.CV_64F,1,0,ksize=5)
sobelx=cv.convertScaleAbs(sobelx)
cv.imshow(“sobelx”,sobelx)
第二步:再求sobelY的值
sobely=cv.Sobel(img1,cv.CV_64F,0,1,ksize=5)
sobely=cv.convertScaleAbs(sobely)
cv.imshow(“sobely”,sobely)
第三部:计算x和Y的和
addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None)
alpha:第一幅图像中元素的权值
beta:第二幅图像的权值
gamma:加到最终结果上的值***注意最后一个参数:0一定要写上,要不然报错
sobelxy=cv.addWeighted(sobelx,0.5,sobely,0.5,0)
cv.imshow(“sobelxy”,sobelxy)
二:scharr算子
scharrx=cv.Scharr(img1,cv.CV_64F,1,0)
scharrx=cv.convertScaleAbs(scharrx)
cv.imshow(“scharrx”,scharrx)
scharry=cv.Scharr(img1,cv.CV_64F,0,1)
scharry=cv.convertScaleAbs(scharrx)
cv.imshow(“scharry”,scharry)
scharrxy=cv.addWeighted(scharrx,0.5,scharry,0.5,0)
scharrxy=cv.convertScaleAbs(scharrxy)
cv.imshow(“scharrxy”,scharrxy)
3.sobel和scharr算子比较
前面说了,两种算子的原理是一样的,只是卷积核不一样,从而造成的准确度的差距。
sobel算子的卷积核是:
scharr算子的卷积核是:
三:laplacian算子
不需要进行X,Y的计算
laplacian=cv.Laplacian(img1,cv.CV_64F)
cv.imshow(“laplacian”,laplacian)