小白学python(opencv边缘检测)
- 边缘检测算子类别
- Canny()
- Sobel()
- Scharr()
边缘检测就是将图像的边缘提取并检测出来,有以下几种方法:
边缘检测算子类别
边缘检测算子:
一阶导数: Roberts、Sobel、Prewitt
二阶导数: Laplacian、Log/Marr、(Kirsch、Nevitia)
非微分边缘检测算子: Canny
(又是数学方面,还是靠百度)
Canny()
OpenCV-Python 中 Canny()已经封装好API,直接调用就已经很方便了,而且效果也是相当不错的。
步骤:
彩色图像转换为灰度图像(以灰度图或者单通道图读入)
对图像进行高斯模糊(去噪)
计算图像梯度,根据梯度计算图像边缘幅值与角度
沿梯度方向进行非极大值抑制(边缘细化)
双阈值边缘连接处理
二值化图像输出结果
"""
cv2.Canny(image, # 输入原图(必须为单通道图)
threshold1,
threshold2, # 较大的阈值2用于检测图像中明显的边缘
[, edges[,
apertureSize[, # apertureSize:Sobel算子的大小
L2gradient ]]]) # 参数(布尔值):
true: 使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开放),
false:使用L1范数(直接将两个方向导数的绝对值相加)。
"""
(这里函数借鉴大佬的思路)
函数:
def edge_demo(image): #边缘检测
blurred = cv.GaussianBlur(image,(3,3),0)
gray = cv.cvtColor(blurred,cv.COLOR_BGR2GRAY)
# x
xgrad = cv.Sobel(gray,cv.CV_16SC1,1,0)
# y
ygray = cv.Sobel(gray,cv.CV_16SC1,0,1)
edge_out = cv.Canny(xgrad,ygray,50,150)
cv.imshow("edge",edge_out)
#输出彩色图片
dst = cv.bitwise_and(image,image,mask= edge_out)
cv.imshow("image",dst)
结果:
其实这里canny参数中直接放原图(不处理)也可以,如:
def edge_demo2(image): #边缘检测2
edge_out = cv.Canny(image,50,150)
cv.imshow("edge",edge_out)
#输出彩色图片
dst = cv.bitwise_and(image,image,mask= edge_out)
cv.imshow("image",dst)
(啧啧啧可见函数的强大)
Sobel()
Sobel的是一阶微分算子,也就是图像的一阶导数,
根据导数的定义,变化越明显的地方,梯度也大,自然
也就对应了图像的边缘。
dst = cv2.Sobel(img, ddepth, dx, dy, [ksize])
img为原始灰度图像;
ddepth为图像深度,也就是图像的位数
dx表示x方向;dy表示y方向;两者一般配合使用
如果是(1,0)表示求x方向梯度,如果是(0,1)表示y方向的梯度;
ksize表示核的大小,一般为默认参数
def Sobel_demo(image): #缘检测Sobel
sobelx = cv.Sobel(image, cv.CV_64F, 1, 0) #沿着x,y取阴影
sobely = cv.Sobel(image, cv.CV_64F, 0, 1)
sobelx = cv.convertScaleAbs(sobelx) #将负值取绝对值
sobely = cv.convertScaleAbs(sobely)
sobelxy = cv.addWeighted(sobelx, 0.5, sobely, 0.5, 0) #,将两个方向的梯度带权重相加
cv.imshow("sobel",sobelxy)
结果:
Scharr()
和Sobel一样的,只是卷积核不一样,操作完全相同。
def scharr_demo(image): #缘检测scharr
scharrx = cv.Scharr(image, cv.CV_64F, 1, 0)
scharry = cv.Scharr(image, cv.CV_64F, 0, 1)
scharrx = cv.convertScaleAbs(scharrx)
scharry = cv.convertScaleAbs(scharry)
scharrxy = cv.addWeighted(scharrx, 0.5, scharry, 0.5, 0)
cv.imshow("scharr", scharrxy)
结果: