python-opencv(10):图像的梯度计算

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()

结果:

扫描二维码关注公众号,回复: 5498193 查看本文章

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()

结果:

猜你喜欢

转载自blog.csdn.net/Mr_zhuzj/article/details/82222107