在OpenCV中,边缘检测的方法有以下几种:
Sobel
Scharr
Laplace
Canny
其中前三种的边缘检测是带方向的
1.Sobel:
cvw.Sobel(filename,ddepth,dx,dy,dst=None,ksize=None,scale=None,delta=None,borderType=None)
ddepth:图像颜色深度(不甚了解)
针对不同的输入图像,输出目标图像有不同的深度,具体组合如下:
- 若src.depth() = CV_8U, 取ddepth =-1/CV_16S/CV_32F/CV_64F
- 若src.depth() = CV_16U/CV_16S, 取ddepth =-1/CV_32F/CV_64F
- 若src.depth() = CV_32F, 取ddepth =-1/CV_32F/CV_64F
- 若src.depth() = CV_64F, 取ddepth = -1/CV_64F
dx:int类型的,表示x方向的差分阶数,1或0
dy:int类型的,表示y方向的差分阶数,1或0
kSize:模板大小,对于Sobel算子这里的取值为1,3,5,7,当不输入的时候,默认为3。特殊的,当kSize = 1的时候,采用的模板为13或者31 而非平时的那些格式
2.Scharr:
Scharr(src, ddepth, dx, dy, dst=None, scale=None, delta=None, borderType=None)
参数和Sobel算子一致,不过,该函数与Sobel的区别在于,Scharr仅作用于大小为3的内核。具有和sobel算子一样的速度,但结果更为精确
例子:对比两种方法的效果
import cv2 as cv
import numpy as np
img = cv.imread("color.jpg")
gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
sobel_x = cv.Sobel(gray,cv.CV_8U,1,0)
sobel_y = cv.Sobel(gray,cv.CV_8U,0,1)
sobel = cv.Sobel(gray,cv.CV_8U,1,1)
scharr_x = cv.Scharr(gray, cv.CV_8U, 1, 0)
scharr_y = cv.Scharr(gray, cv.CV_8U, 0, 1)
cv.imshow("src", img)
cv.imshow("Sobel_x", sobel_x)
cv.imshow("Sobel_y", sobel_y)
cv.imshow("Sobel", sobel)
cv.imshow("Scharr_x", scharr_x)
cv.imshow("Scharr_y", scharr_y)
cv.waitKey(0)
cv.destroyAllWindows()
3.Laplace:
Laplacian(src,ddepth,dst=None,ksize=None,scale=None,delta=None,borderType=None)
scale:Double类型的,计算拉普拉斯可选比例因子,有默认值1
delta:加到输出像素的值,默认为0
borderType:边界模式。默认BORDER_DEFAULT
例子:使用ksize = 3来对吧sobel和laplace
import cv2 as cv
import numpy as np
img = cv.imread("color.jpg")
gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
sobel = cv.Sobel(gray,cv.CV_8U,1,1)
laplace = cv.Laplacian(gray, cv.CV_8U,ksize = 3)
cv.imshow("laplace", laplace)
cv.imshow("Sobel", sobel)
cv.waitKey(0)
cv.destroyAllWindows()
4.canny
Canny(filename,threshold1,threshold2,edges =None,apertureSize = None,L2gradient = None)
threshold1:int类型,低阈值
threshold2:int类型,高阈值
edeges:单通道存储边缘的输出图像
apertureSize:Sobel算子内核Size大小
L2gradiend:Bool类型的,为真表示使用更精确的L2范数进行计算(两个方向的倒数的平方再开放),为假表示用L1范数(直接将两个方向导数的绝对值相加)
例子:`import cv2 as cv
import numpy as np
img = cv.imread(“color.jpg”)
gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
#高斯滤波
gauss = cv.GaussianBlur(gray, (3,3), 1)
cv.imshow(“Gauss”,gauss)
canny = cv.Canny(gray,0,200)
cv.imshow(“Canny”,canny)
cv.waitKey(0)
cv.destroyAllWindows()`
————————————————
最后,感谢博主的分享。
原文链接:https://blog.csdn.net/qq_34711208/article/details/81703341