1.sobel算子
dst=cv2.Sobel(src,ddepth,dx,dy,[ksize])
ddeph:处理结果图像深度
在处理一般的8位图像时,当计算的梯度小于0时,会自动变为0,造成边界信息的丢失。因此一般讲ddeph设为cv2.CV_64F,然后用函数讲结果图像转为8位的图像。
dst=cv2.convertScaleAbs(dst)
一般来说求取边界是,分别取dx=1,dy=1,然后将两个边界图像相加,不要讲dx,dy同时等于1
想要对不同方向的梯度取不同的权重,可以用函数addWeighted:
dst=cv2.addWeighted(src1,alpha,src2,beat,gamma)
程序示例:
import cv2
import numpy as np
img=cv2.imread("3.png",cv2.IMREAD_UNCHANGED)
sobelx=cv2.Sobel(img,cv2.CV_64F,dx=1,dy=0)
sobelx=cv2.convertScaleAbs(sobelx)
sobely=cv2.Sobel(img,cv2.CV_64F,dx=0,dy=1)
sobely=cv2.convertScaleAbs(sobely)
result=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv2.imshow("priginal",img)
cv2.imshow("sobelx",sobelx)
cv2.imshow("sobely",sobely)
cv2.imshow("result",result)
cv2.waitKey()
cv2.destroyAllWindows()
结果:
2.scharr算子:原理和sobel算子原理一样,只是卷积核不一样,因此准确度更高一点
dst=Scharr(src,ddepth,dx,dy)
程序示例:
import cv2
import numpy as np
img=cv2.imread("3.png",cv2.IMREAD_UNCHANGED)
scharrx=cv2.Scharr(img,cv2.CV_64F,dx=1,dy=0)
scharrx=cv2.convertScaleAbs(scharrx)
scharry=cv2.Scharr(img,cv2.CV_64F,dx=0,dy=1)
scharry=cv2.convertScaleAbs(scharry)
result=cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
cv2.imshow("original",img)
cv2.imshow("scharrx",scharrx)
cv2.imshow("scharry",scharry)
cv2.imshow("result",result)
cv2.waitKey()
cv2.destroyAllWindows()
结果:
3.sobel和scharr算子比较
前面说了,两种算子的原理是一样的,只是卷积核不一样,从而造成的准确度的差距。
sobel算子的卷积核是:
scharr算子的卷积核是:
用lena的图片做个示例:
import cv2
import numpy as np
img=cv2.imread("lena.bmp",cv2.IMREAD_UNCHANGED)
sobelx=cv2.Sobel(img,cv2.CV_64F,dx=1,dy=0)
sobelx=cv2.convertScaleAbs(sobelx)
sobely=cv2.Sobel(img,cv2.CV_64F,dx=0,dy=1)
sobely=cv2.convertScaleAbs(sobely)
result=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
scharrx=cv2.Scharr(img,cv2.CV_64F,dx=1,dy=0)
scharrx=cv2.convertScaleAbs(scharrx)
scharry=cv2.Scharr(img,cv2.CV_64F,dx=0,dy=1)
scharry=cv2.convertScaleAbs(scharry)
result1=cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
cv2.imshow("original",img)
cv2.imshow("result",result)
cv2.imshow("result1",result1)
cv2.waitKey()
cv2.destroyAllWindows()
结果:
很明显,scharr算子的效果更好。
4.Laplacian算子
语法:
dst=cv2.Laplacian(src,ddepth)
程序示例:
import cv2
import numpy as np
img=cv2.imread("lena.bmp",cv2.IMREAD_UNCHANGED)
result=cv2.Laplacian(img,cv2.CV_64F)
result=cv2.convertScaleAbs(result)
cv2.imshow("original",img)
cv2.imshow("result",result)
cv2.waitKey()
cv2.destroyAllWindows()
结果: