Canny边缘检测(cv2.Canny())

一、Canny边缘检测

Canny 边缘检测是一种使用多级边缘检测算法检测边缘的方法。

Canny()边缘检测步骤:

Canny 边缘检测分为如下几个步骤:

1.去噪。噪声会影响边缘检测的准确性,因此首先要将噪声过滤掉。

2.计算梯度的幅度与方向。

3.非极大值抑制,即适当地让边缘"变瘦"。

4.确定边缘。使用双阈值算法确定最终的边缘信息。

1. 滤波去除图像噪声

图像边缘容易受到噪声的干扰,为了避免检测到错误的边缘信息,通常需要对图像进行滤波以去除噪声。滤波的目的是平滑一些纹理较弱的非边缘区域,以得到更准确的边缘。滤波,就是通过滤波器(核/模板)对像素点周围的像素加权计算平均值。滤波器的核越大,边缘信息对于噪声的敏感度就越低。不过,核越大,边缘检测的定位错误也会随之增加。

2. 计算梯度

梯度的方向与边缘的方向是垂直的。 边缘检测算子返回水平方向的Gx和垂直方向的Gy。梯度的幅度𝐺和方向𝛩(用角度值表示)为:

3. 非极大值抑制

在获得了梯度的幅度和方向后,遍历图像中的像素点,去除所有非边缘的点。逐一遍历像素点,判断当前像素点是否是周围像素点中具有相同梯度方向的最大值,并根据判断结果决定是否抑制该点。

针对每一个像素点: 如果该点是正/负梯度方向上的局部最大值,则保留该点。如果不是,则抑制该点(归零)。

4. 应用双阈值确定边缘

完成上述步骤后,图像内的强边缘已经在当前获取的边缘图像内。但是,一些虚边缘可能也在边缘图像内。这些虚边缘可能是真实图像产生的,也可能是由于噪声所产生的。对于后者,必须将其剔除。设置两个阈值,其中一个为高阈值 maxVal,另一个为低阈值 minVal。根据当前边缘像素的梯度值(指的是梯度幅度,下同)与这两个阈值之间的关系,判断边缘的属性。具体步骤为:

(1)如果当前边缘像素的梯度值大于或等于 maxVal,则将当前边缘像素标记为强边缘。

(2)如果当前边缘像素的梯度值介于maxVal 与 minVal 之间,则将当前边缘像素标记为虚边缘(需要保留)。

(3)如果当前边缘像素的梯度值小于或等于 minVal,则抑制当前边缘像素。 得到了虚边缘后,需要对其做进一步处理。

通过判断虚边缘与强边缘是否连接,来确定虚边缘到底属于哪种情况。通常情况下,如果一个虚边缘:与强边缘连接,则将该边缘处理为边缘。与强边缘无连接,则该边缘为弱边缘,将其抑制。

二、Canny 函数及使用

edge = cv2.Canny(image, threshold1, threshold2, apertureSize, L2gradient)

image:要检测的图像,通常是灰度图像,必须是单通道图像( CV_8UC1)。

threshold1:阈值1(最小值), 如果像素值小于该值,则被认为不是边缘。

threshold2:阈值2(最大值),如果像素值大于该值,则被认为是强边缘。

apertureSize:sobel算子(卷积核)大小

L2gradient :布尔值。

True:使用更精确的L2范数进行计算(即两个方向的导数的平方和再开方)

False:使用L1范数(直接将两个方向导数的绝对值相加)

复制代码
# canny 边缘检测

import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块
 
# 1.读取图片
src = cv.imread('2.jpg') #读取图像
print('src.shape=',src.shape)

# 2.转换为灰度图像
gray_img = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

# 3.分割图像
[b,g,r ]=cv.split(src)
print('b.shape=',b.shape)

cv.imshow('b',b)
cv.imshow('g',g)
cv.imshow('r',r)

# 4.通道合并
mergesrc = cv.merge([b,g,r]) #合并
cv.imshow('mergesrc',mergesrc)


# 5.边缘检测
edge1=cv.Canny(src,10,50)  #边缘检测
edge2=cv.Canny(src,100,150) #边缘检测
edge3=cv.Canny(src,255,500) #边缘检测
edge4=cv.Canny(src,255,800) #边缘检测

#print('b=',b)
 
# 6.水平拼接edge3和edge4图像
edge5=np.hstack((edge3,edge4))

# 7.显示和保存图像
cv.imshow('src',src)
cv.imshow('edge1',edge1)
cv.imwrite('Canny-edge1.png', edge1) #保存图像
cv.imshow('edge2',edge2)
cv.imwrite('Canny-edge2.png', edge2) #保存图像
cv.imshow('edge3',edge3)
cv.imwrite('Canny-edge3.png', edge3) #保存图像
cv.imshow('edge4',edge4)
cv.imwrite('Canny-edge4.png', edge4) #保存图像

# 8.显示拼接图片
cv.namedWindow('Canny-edge5',0 ) 
cv.imshow('Canny-edge5', edge5)

cv.waitKey()  # 图像不关闭
cv.destroyAllWindows()  # 释放所有窗口 
相关推荐
Navicat中国1 小时前
Navicat 18 内置 AI 助手让数据库开发从繁琐操作迈向智能协作
大数据·人工智能·数据库开发
4SAPI1 小时前
多模型请求路由怎么设计?成本、速度和能力如何平衡
人工智能·python·gateway·php
魔乐社区2 小时前
翼芯・智算测试与适配优化专区,让国产算力“选得准、跑得通、用得好“
人工智能·开源·大模型
XCDoris3 小时前
郴州logo设计机构
大数据·人工智能·python
Goboy4 小时前
一个人带三个Agent,我用全新TRAE从0到1搭了个资讯周刊站
人工智能·trae
俊哥V4 小时前
每日 AI 研究简报 · 2026-10-19
人工智能·ai
AI_AGENT_DEV_AI4 小时前
AI英语教培智能体的开发
人工智能
物联网软硬件开发-轨物科技4 小时前
【技术白皮书】光伏清检一体化机器人系统解决方案技术白皮书
大数据·运维·网络·人工智能·机器人
海宇数据4 小时前
零信任架构实战:基于海宇网上踪迹欺诈行为识别构建自动化信贷资信评估网关
运维·人工智能·架构·自动化
冬奇Lab4 小时前
开源项目第242期:HyperFrames —— 写 HTML 就能渲染视频,专为 AI Agent 设计的确定性视频框架
人工智能·开源·音视频开发