百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

opencv(5)--边缘检测Canny(opencv sobel边缘检测)

itomcoil 2025-06-18 21:43 6 浏览

1、主要参考

(1)官网:https://docs.opencv.org/

(2)很不错:
https://blog.csdn.net/WZZ18191171661/article/details/89762062

(3)非常不错:
https://zhuanlan.zhihu.com/p/651610886

2、原理

2.1函数定义

(1)python

cv.Canny(	image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]]	) ->	edges

(2)官网

(3)参数,参考官网

  • 第1个参数是(8-bit input image灰度输入图像
  • 第2个参数,输出边缘(8位图,和输入尺寸相同)
  • 第3个参数,threshold1 first threshold for the hysteresis procedure(哈哈).
  • 第4个参数,second threshold for the hysteresis procedure(哈哈).
  • 第5个参数用来计算图像梯度的 Sobel 卷积核的大小,默认值为 3;
  • 第6个参数是 L2gradient,用来设定求梯度大小的方程。如果设为 True,就会使用我们上面提到过的方程,否则使用方程:代替,默认值为 False。

2.2补充第3个参数和第4个参数说明

这两个参数:一个低阈值TL和一个高阈值TH,比例在1:2到1:3内

双阈值检测是确定那些边界才是真正的边界。需要设置两个阈值:minValmaxVal

这里需要判断图像的灰度梯度与 maxVal 和 minVal 的大小:

  • 梯度值 > maxVal : 视为边界
  • minVal < 梯度值 < maxVal : 是否与某个被确定为真正的边界点相连,如果是就认为它也是边界点,如果不是就抛弃
  • 梯度值 < minVal :舍弃

例如下图举例说明:

A 高于阈值 maxVal 所以是真正的边界点,C 虽然低于 maxVal 但高于 minVal 并且与 A 相连,所以也被认为是真正的边界点而 B 就会被抛弃,因为他不仅低于 maxVal 而且不与真正的边界点相连。所以选择合适的 maxVal 和 minVal 对于能否得到好的结果非常重要。 在这一步一些小的噪声点也会被除去,因为已经假设边界都是一些长的线段。

PS:第3和第4个参数的如何设定很重要,下面第4章再说

2.2补充第6个参数说明

第6个参数,如果是True,计算公式是L2距离(这个更OK,PS)

第6个参数,如果是False,计算公式是L1距离

官网解释如下:

3详细描述

主要参考了
https://blog.csdn.net/WZZ18191171661/article/details/89762062

3.1什么是Canny边缘检测算法?

Canny边缘检测算子是John F. Canny于 1986 年开发出来的一个多级边缘检测算法。更为重要的是 Canny 创立了边缘检测计算理论(Computational theory of edge detection)解释这项技术如何工作。

通常情况下边缘检测的目的是在保留原有图像属性的情况下,显著减少图像的数据规模。目前有多种算法可以进行边缘检测,虽然Canny算法年代久远,但可以说它是边缘检测的一种标准算法,而且仍在研究中广泛使用。其效果如下图所示:

3.2最优边缘准则是什么

  • 最优检测:算法能够尽可能多地标识出图像中的实际边缘,漏检真实边缘的概率和误检非边缘的概率都尽可能小;
  • 最优定位准则:检测到的边缘点的位置距离实际边缘点的位置最近,或者是由于噪声影响引起检测出的边缘偏离物体的真实边缘的程度最小;
  • 检测点与边缘点一一对应:算子检测的边缘点与实际边缘点应该是一一对应。为了满足这些要求 Canny 使用了变分法(calculus of variations),这是一种寻找优化特定功能的函数的方法。最优检测使用四个指数函数项表示,但是它非常近似于高斯函数的一阶导数

3.3Canny算法实现步骤

  • (1)应用高斯滤波来平滑图像,目的是去除噪声;
  • (2)计算图像的强度梯度(intensity gradients);
  • (3)应用非最大抑制(non-maximum suppression)技术来消除边误检(本来不是但检测出来是)
  • (4)应用双阈值的方法来决定可能的(潜在的)边界;
  • (5)利用滞后技术来跟踪边界。

4、双阈值参数自动选择方法1(还行)

Canny的两个参数如何定合适,下面的例子给出了说明

import numpy as np
import cv2
# import argparse
# import glob
# import os

# 定义auto_canny函数
def auto_canny(image, sigma=0.33):
	# 计算单通道像素强度的中位数
	v = np.median(image)

	# 选择合适的lower和upper值,然后应用它们
	lower = int(max(0, (1.0 - sigma) * v))
	upper = int(min(255, (1.0 + sigma) * v))
	# edged = cv2.Canny(image, lower, upper)
	# edged = cv2.Canny(image, lower, upper)
	edged = cv2.Canny(image, lower, upper,L2gradient=True)

	return edged


if __name__ == '__main__':

    # 读取图片
    image = cv2.imread("D:/chen_visionprojectdevelop/0pic/dstyaowang.bmp")
    # image = cv2.imread("D:/chen_visionprojectdevelop/0pic/Dst1.bmp")
    # image = cv2.imread("D:/chen_visionprojectdevelop/0pic/Src2.jpg")
    # 灰度化处理
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # 进行高斯模糊去噪
    # blurred = cv2.GaussianBlur(gray, (3, 3), 0)
    blurred = cv2.GaussianBlur(gray, (3, 3), 0)
    # blurred = cv2.GaussianBlur(gray, (5, 5), 0)
    # blurred = cv2.GaussianBlur(gray, (5, 5), 10)

    # 分别使用宽阈值、窄阈值和自动确定的阈值进行测试
    wide = cv2.Canny(blurred, 10, 200,L2gradient=True)
    # tight = cv2.Canny(blurred, 225, 250)
    # tight = cv2.Canny(blurred, 225, 250)
    tight = cv2.Canny(blurred, 280, 360)
    auto = auto_canny(blurred,0.1)
    # auto = auto_canny(blurred,2)
    result = np.hstack([wide, tight, auto])
    # 显示并保存结果
    cv2.namedWindow("Original", cv2.WINDOW_NORMAL)
    cv2.namedWindow("Edges", cv2.WINDOW_NORMAL)
    cv2.imshow("Original", image)
    cv2.imshow("Edges", result)
    cv2.waitKey(0)

具体可以参考
https://blog.csdn.net/WZZ18191171661/article/details/89762062

注意:自动缘分阈值的sigma需要考虑如何合适,大部分图0.33是合适的

5、双阈值参数自动选择方法2(感觉更)

参考了:
https://blog.csdn.net/weixin_43271137/article/details/130035772?share_token=
11191b94-559f-48d4-9186-6a30a1a68644

(1)优化选择的代码

def auto_canny2(image):
	# 计算单通道像素强度的中位数
	v = np.median(image)

	# 选择合适的lower和upper值,然后应用它们
	
	# 可以将高阈值设置为平均灰度值的1.5倍或2倍。
	upper = int(2*v)
	# 可以将低阈值设置为高阈值的1/3或1/4。
	lower = int(upper/3)

	# edged = cv2.Canny(image, lower, upper)
	# edged = cv2.Canny(image, lower, upper)
	edged = cv2.Canny(image, lower, upper,L2gradient=True)

	return edged

(2)完整测试,修改字数受限,简化

...................
...................
    blurred = cv2.GaussianBlur(gray, (5, 5), 0)
...................
...................
auto2 = auto_canny2(blurred)
...................

6、总结

(1)高斯核选择(5,5)

(2)参数选择很重要,要么手动调不鲁棒,要么自动算法。感觉方法2的自动算还可以

(3)高斯中使用sobel算子的评价,感觉L2比较好。也就是,L2gradient=True

相关推荐

基于Python开发的家居用品外贸网站(B2B企业官网)

作为一名程序员,平时除了本职工作,我也会利用业余时间做一些兼职和副业,大部分的私活都是从某鱼和CSDN接的,有些是别人介绍的。最近刚好接到了一个外贸企业网站的开发需求,客户是一家位于深圳的家居用品公司...

摄像头视频流处理方法总结,如何掌握视频流处理技巧?

摄像头视频流处理是指其技术本质、关键处理流程和核心目标。1.视频流的定义视频流(VideoStream)是摄像头连续采集图像帧(frame),并以压缩编码格式(如H.264/H.265)传输或存储...

大学生机器人开发辅导|代码、机构到控制全链路进阶

想做机器人项目,却苦于不会硬件、算法和代码?SRTP、大创、全国竞赛动手项目无从下手?Arduino、STM32、RaspberryPi模块让你头大?想在毕业设计、创新实践、社团活动做出有亮点的机器...

OpenCV实现手势音量控制(opencv按钮)

前言:Hello大家好,我是Dream。今天来学习一下如何使用OpenCV实现手势音量控制,欢迎大家一起前来探讨学习~一、需要的库及功能介绍本次实验需要使用OpenCV和mediapipe库进行手...

DIY激光枪薄纱蟑螂!AI杀蚊子博士新作,项目已开源

萧箫发自凹非寺量子位|公众号QbitAI几个世纪来,人类都处在被蟑螂支配的恐惧中。但比蟑螂更恐怖的,是打不死还消失了的蟑螂……现在,一位博士搞出了一套自动识别并薄(爆)纱(杀)蟑螂的激光“炮...

为了杀蚊子,这位博士用树莓派DIY了一把激光枪

金磊发自凹非寺量子位报道|公众号QbitAI世人苦蚊子久矣。尤其在夏夜,耳边嗡嗡作响,甚至还得与其“挑灯夜战”个三百回合。为此,一个国外博士便DIY了一种高端的杀蚊方式:计算机视觉精准定...

草根PLC革命:低价魔改开源方案对决高价LabVIEW工业视觉系统!

魔改方案:三菱FX5U+树莓派魔改架构硬件清单创新设计:双核协同架构:PLC负责实时控制+树莓派运行AI算法EtherCAT菊花链:省交换机成本,布线效率提升70%五大开源工具:CODESYSR...

机器人开发进阶:看懂这五个项目中的软硬件哲学

DIY机器人项目正逐渐成为技术爱好者和创客们的热门选择。无论是用于教育、娱乐还是实际应用,机器人技术都展现了其强大的潜力。本文将介绍五个EEWorld上备受工程师关注的五个DIY项目,通过本文,您将深...

树莓派到底是什么?能干什么?有必要买吗?

很多人疑惑,树莓派到底是什么?能干什么?有必要买吗?今天我带着这三个疑惑给大家解答;一、树莓派到底是什么?树莓派通俗的理解就是一台便携式小型电脑,起码最新的树莓派4当一台电脑是可以的;往深了说,他可以...

用腾讯优图AI视觉模组做一个驾驶疲劳监测仪

道路千万条,安全第一条,相信每个人都是牢记于心的,“喝酒不开车,开车不喝酒”其实不难,难的是防范始料未及的事件,疲倦就是众多始料未及事件中,杀伤力稳居前排的,前一秒心里还在想坚持坚持,下一秒可能就失去...

Z410升级树莓派4B机型终于和大家见面了

*Z410-4B入门二次开发平台*经过近1年的反复测试,Z410升级树莓派4B的机型终于和大家见面了!Z410机型设计的初衷,就是想为大家提供一款基础的、开源的、高性价比、可扩展、可进行二次开发的无人...

有保险柜怕不安全,用树莓派制作一款只有刷脸才能开的保险柜吧

眨眨眼睛就能保住身家,好过记住密码或拿着钥匙,你的脸就是保险柜的钥匙!这个作品将展示给大家如何用树莓派和摄像头制作一个人脸识别的保险柜,当然,如果不慎毁容或整容,不好意思。。。直接拿锤子砸了吧软件部分...

项目分享|仅需1板卡+1摄像头,3步完成人脸喜怒哀乐识别

使用OpenCV、TensorFlow和Keras,基于RaspberryPi进行情绪识别,你的心情一览无余。面部表情识别系统可用于多种应用,可以用来研究或分析人的情绪。许多公司正在植入...

价值8美元的OpenAsk收费问题回答:孩子小学五年级如何入门编程?

从今天起,给大家持续更新OpenAsk上的一些收费问题的回答系列,内容信不信由你,但是如果您仔细看了分析后会说,真香。#少儿编程是智商税吗#“更多内容欢迎关注-司马南柯一梦”(欢迎随意转发)下面是一位...

再见 Pycharm,这款开箱即用的轻量级神器你值得拥有

作者:豆豆来源:Python技术如果你问我最好用的IDE是什么,那我肯定会毫不犹豫的告诉你Pycharm。毕竟jetbrains出品必属精品。但对于很多初学者来讲,Pycharm显得略笨...