Python OpenCV实现Canny边缘检测:原理、步骤与代码示例
本文详解利用Python和OpenCV进行Canny边缘检测的完整流程,涵盖去噪、梯度计算、非极大值抑制及滞后阈值四个核心步骤。通过cv2.Canny函数实现一键检测,并演示如何结合滑动条动态调整阈值下限与上限,以观察不同参数对边缘提取效果的影响。
Canny边缘检测原理与步骤
本文介绍如何使用Python结合OpenCV库完成图像边缘检测任务。通常情况下,该过程需依次执行以下关键步骤:
1、去噪处理
首先需对原始图像进行降噪,例如使用cv2.GaussianBlur()等滤波函数,以减少噪声对后续边缘检测的干扰。
2、计算图像梯度
图像梯度反映了相邻像素间灰度值的变化幅度。变化剧烈的区域通常对应图像边缘。这一过程可简化为计算像素值的差分变化。

3、非极大值抑制
在获取梯度的大小和方向后,需对整幅图像进行扫描,以消除非边界上的冗余点。具体做法是对每个像素点进行检查,判断其梯度值是否为同方向邻域内的最大值。如图所示:

4、滞后阈值处理
此步骤旨在确定真正的边缘像素。系统需设定两个阈值:minVal(下限)和maxVal(上限)。若像素点的灰度梯度高于maxVal,则被判定为真实边缘;若低于minVal,则直接丢弃。对于介于两者之间的像素点,需检查其是否与已被确认为真实边缘的像素相连:若相连,则保留为边缘点;否则予以剔除。具体逻辑如下图所示:

OpenCV Canny函数实现与参数调整
在Python的OpenCV接口中,提供了cv2.Canny函数,可一键执行上述完整的边缘检测流程。
接下来,通过具体实验演示如何利用Canny函数进行边缘检测。
Canny函数主要需要指定以下参数:
1、待检测边缘的原始图像 2、阈值下限(minVal) 3、阈值上限(maxVal)
为了直观展示不同阈值范围对边缘检测结果的影响,代码中设置了两个滑动条,分别用于动态调整阈值的上限和下限。
完整实现代码如下:
# -*- coding: utf-8 -*-
"""
Created on Thu Sep 13 14:23:32 2018
@author: Leon
内容:
对图片进行边缘检测;
添加滑动条,可自由调整阈值上下限。
"""
import cv2
import numpy as np
def nothing(x):
pass
cv2.namedWindow('Canny',0)
# 创建滑动条
cv2.createTrackbar('minval','Canny',0,255,nothing)
cv2.createTrackbar('maxval','Canny',0,255,nothing)
img = cv2.imread('Tree.jpg',0)
# 高斯滤波去噪
img = cv2.GaussianBlur(img,(3,3),0)
edges =img
k=0
while(1):
key = cv2.waitKey(50) & 0xFF
if key == ord('q'):
break
# 读取滑动条数值
minval = cv2.getTrackbarPos('minval','Canny')
maxval = cv2.getTrackbarPos('maxval','Canny')
edges = cv2.Canny(img,minval,maxval)
# 拼接原图与边缘监测结果图
img_2 = np.hstack((img,edges))
cv2.imshow('Canny',img_2)
cv2.destroyAllWindows()
运行效果如图所示:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













