参考:
https://zhuanlan.zhihu.com/p/42122107
https://www.cnblogs.com/pacino12134/p/9877971.html(非最大信号抑制)
Canny边缘检测总共可以分为5步:
- 对要处理的图像做高斯模糊(因为canny是对噪声敏感的边缘提取算法)
- 灰度转换
- 计算梯度
- 非最大信号抑制
- 高低阈值输出二值图像
视频源码:
import cv2 as cv
import numpy as np
def edge_demo(image):
blurred = cv.GaussianBlur(image, (3, 3), 0) # 做高斯模糊
gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY) # 转换为灰度图
xgrad = cv.Sobel(gray, cv.CV_16SC1, 1, 0) # 计算梯度,因为canny的API不能收浮点数,所以我们深度选择CV_16SC1
ygrad = cv.Sobel(gray, cv.CV_16SC1, 0, 1)
edge_output = cv.Canny(xgrad, ygrad, 50, 150) # 做canny,50和150分别是高低阈值,高:低一般在3:1到2:1之间
cv.imshow("Canny Edge", edge_output)
dst = cv.bitwise_and(image, image, mask=edge_output)
cv.imshow("Color Edge", dst)
print("-----------Python OpenCV Tutorial--------------")
src = cv.imread("C:/cv-samples/data/lena.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
edge_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()