Canny边缘提取
- Canny算法介绍
- OpenCV中的演示
Canny算法介绍
Canny是边缘检测算法,在1986年提出的。是一个很好的边缘检测器,同时也是很常用也很实用的图像处理方法
Canny算法的步骤:
- 高斯模糊 - GaussianBlur (降噪)
- 灰度转换 - cvtColor
- 计算梯度 – Sobel/Scharr
- 非最大信号抑制
- 高低阈值输出二值图像
非最大信号抑制:
高低阈值链接
- T1, T2为阈值,凡是高于T2的都保留,凡是小于T1都丢弃,从高于T2的像素出发,凡是大于T1而且相互连接的,都保留。最终得到一个输出二值图像。
- 推荐的高低阈值比值为 T2: T1 = 3:1/2:1其中T2为高阈值, T1为低阈值
# -*- coding:utf-8 -*-
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) # CannyAPI要求这里不能是浮点数
ygrad = cv.Sobel(gray, cv.CV_16SC1, 0, 1)
edge_output = cv.Canny(xgrad, ygrad, 50, 150)
# edge_output = cv.Canny(gray, 50, 150) # 也可以直接用灰度图像
cv.imshow("Canny Edge", edge_output)
dst = cv.bitwise_and(image, image, mask=edge_output)
cv.imshow("Color Edge", dst)
# 读取图片
src = cv.imread("D:\Python\Projects\OpenCV_toturial\images\lena.png")
# 创建opencv的GUI窗口
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
# 将图片放入指定名字的窗口中显示出来
cv.imshow("input image", src)
edge_demo(src)
# 设置waitKey中的delay为0,程序会等待用户操作后关闭窗口
cv.waitKey(0)
cv.destroyAllWindows()