Canny边缘检测
引言
OpenCV提供了Canny边缘检测函数,只用一行代码就能实现图像的边缘检测,看到这里你是不是很激动呢?
—————————————————————————-
Canny边缘检测实例
# -*- coding:utf-8 -*-
import cv2
image = cv2.imread('images/test.jpg')
cv2.namedWindow("Image")
# Canny函数,三个参数:源图像,低阈值,高阈值
image = cv2.Canny(image, 200, 300)
cv2.imshow("Image", image)
cv2.waitKey(0)
程序的运行结果如下:
—————————————————————————-
自己写一个小Demo 模拟边缘检测
# -*- coding:utf-8 -*-
import cv2
import numpy as np
image = cv2.imread('images/test.jpg')
# Step1. 自定义Sobel卷积核
kernel_x = np.array([[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1]])
kernel_y = np.array([[1, 2, 1],
[0, 0, 0],
[-1, -2, -1]])
# Step2. 初始化中间结果矩阵
gx = np.zeros(image.shape, dtype = np.uint8)
gy = np.zeros(image.shape, dtype = np.uint8)
# Step3. 使用自定义的卷积核进行卷积
cv2.filter2D(image, -1, kernel_x, gx)
cv2.filter2D(image, -1, kernel_y, gy)
# 显示卷积的中间结果
cv2.imshow("gx", gx)
cv2.imshow("gy", gy)
# Step4. 合并两个图像
gx = cv2.addWeighted(gx, 0.5, gy, 0.5, 0)
cv2.imshow("gx2", gx)
# Step5. 阈值抑制处理
thresh = 50 #阈值设置为50
ret, dst = cv2.threshold(gx, thresh, 255, cv2.THRESH_BINARY)
cv2.imshow("ss", dst)
cv2.waitKey(0)
程序的运行结果如下:
可以看到,程序简单提取了图像中的边缘。当然,如果要实现完整的Canny边缘检测,还需要进行非极大值抑制和边缘跟踪。
有关Canny边缘检测的C++源码分析,请看这里