Canny边缘检测是一种常用的边缘提取算法,由高斯滤波,梯度计算,非极大值抑制和双阈值一系列算法流程来实现,抗噪能力强。你可以根据实际的需要来调整各个部分,以满足应用需求。
opencv Canny算子参数
cv2.Canny(srcImg, threshold1, threshold2[, size, L2gradient])
threshold1,threshold2:对应Canny算法中的双阈值,来确定真实和可能是边缘信息
size:为上一期中Sobel算子的ksize信息
L2gradient:bool类型,计算梯度的方法,按照官方文档中的解释为,采用不同的计算梯度值方式,默认为false(计算量小,够用)
1. Canny边缘检测效果
import cv2
src_img = cv2.imread('building.jpg', -1)
gray_img = cv2.cvtColor(src_img, cv2.COLOR_BGR2GRAY)
# Canny算子检测边缘信息
edges_img = cv2.Canny(gray_img, 100, 200, 5)
cv2.imshow('gray_img', gray_img)
cv2.imshow('canny_img', edges_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Canny边缘检测
在Canny处理前,你可以添加滤波来消除图像中的噪点信号,比如高斯滤波。滤波会使得你的图像内容变得模糊,独立的噪点信号被平滑后对你提取边缘特征是非常有帮助的(比如在霍夫变换前)。
gaussian+canny效果
滤去建筑物内部的细节信息,在进入Canny处理前添加如下代码:
gaussian_img = cv2.GaussianBlur(gray_img,(3, 3),0)
参数(3, 3)为kernel size,必须都是奇数,0为标准差,这里表示会根据kernel size来计算,后面会介绍opencv中的滤波函数。
2. 几种常用的边缘提取方法对比
常用的边缘提取方法对比import cv2
import numpy as np
img = cv2.imread("building.jpg")
gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 高斯平滑
gaussian_img = cv2.GaussianBlur(gray_img,(3, 3),0)
# Laplacian算子
laplacian_edge_img = cv2.Laplacian(gaussian_img, -1, ksize =3, delta = 5)
# Sobel提取边缘
grad_x = cv2.Sobel(gaussian_img, cv2.CV_64F, 1, 0 )
abs_grad_x = cv2.convertScaleAbs( grad_x )
grad_y = cv2.Sobel( gaussian_img, cv2.CV_64F, 0, 1 )
abs_grad_y = cv2.convertScaleAbs(grad_y)
sobel_img = cv2.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0)
# ret,sobel_edge_img=cv2.threshold(sobel_img, 80, 255, cv2.THRESH_BINARY)
# Canny算子
canny_edges_img = cv2.Canny(gaussian_img, 100, 200, 5)
cv2.imshow('laplacian_edge_img', laplacian_edge_img)
cv2.imshow('sobel_edge_img', sobel_img)
cv2.imshow('canny_edges_img', canny_edges_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
其中Sobel实现的代码和上一期提到的方法稍有不同,对边缘的提取效果比上一期提及的直接使用1,1来对两个方向求梯度要好。这里注释的对Sobel结果做阈值处理目的主要是简化图像的信息,方便后续接其他处理。
对于opencv-python的图像分割--Canny边缘检测部分有问题欢迎留言, Have Fun With OpenCV-Python, 下期见。
网友评论