当前位置: 首页 > news >正文

openCV实战-系列教程5:边缘检测(Canny边缘检测/高斯滤波器/Sobel算子/非极大值抑制/线性插值法/梯度方向/双阈值检测 )、原理解析、源码解读

打印一个图片可以做出一个函数:

def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows()

1、Canny边缘检测流程

Canny是一个科学家在1986年写了一篇论文,所以用自己的名字来命名这个检测算法,Canny边缘检测算法这里写了5步流程,会用到之前《openCV实战-系列教程》的内容。 

  1. 使用高斯滤波器,以平滑图像,滤除噪声。
  2. 计算图像中每个像素点的梯度强度和方向。
  3. 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
  4. 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
  5. 通过抑制孤立的弱边缘最终完成边缘检测。

滤波:Canny检测算法使用的滤波器是高斯滤波器,通过滤波器可以对图像进行平滑处理。所以第一步需要过滤噪声,当进行检测的时候,肯定需要计算梯度,当遇到噪音点也会发生梯度的变化,所以为了更好的做到边缘检测,第一步需要去噪。

梯度:之前我们计算梯度的时候,只需要计算大小就行了,但是现在需要计算一下方向,所以梯度计算包括强度和方向。

非极大值抑制:计算的梯度大小有不同,比如在一个3*3的卷积核中,有些梯度比较小,相对大的就会保留下来,小的梯度就不会保留,只留下最明显的。 比如在人脸检测中,需要把人脸部分打出一个框的标识,计算的时候会计算出多个框,每个框都有一个概率值,最后只保留概率最大的那个框,而其他的框就会被抑制掉。

双阈值:计算边界的时候,会计算出多个候选值,在候选值中会再进行计算,只保留最接近真实的那个候选值边界。

完成边缘检测:将前面的结果都组合起来,完成边缘检测。

2、高斯滤波器

在前面的内容中已经讲解过,中间点比较大,越边缘的点越小,图中的H对高斯滤波器的滤波核进行归一化处理,然后再将滤波核H框住的区域A对应位置相乘再求和得到一个结果e。

3、梯度方向

Canny计算梯度使用的是Sobel算子(前面已经讲过这个内容), Sobel算子中需要分别计算水平和竖直两个方向的Gx和Gy(Gx和Gy的计算如上图),将这个结果融合到一起G计算方法如上图

梯度方向就是θ值,通过Gx和Gy计算得到,计算方法如上图。

4、非极大值抑制

4.1 方法A

如图所示,C点是目标像素点,需要判断C是不是一个极大值点,然后红色方框是它的周围的8个像素,蓝色线是C点的梯度方向,梯度方向和边界方向应该是垂直的关系。

如图所示,g1、g2、g3、g4、c都是一个像素点,而Q、Z是梯度方向与方框的交点,Q和Z不是一个像素是一个亚像素,使用线性插值法计算这个亚像素。 

首先g1、g2、g3、g4的梯度(梯度幅值,上一节讲到的梯度计算)都能够计算出来, Q就是g1和g2之间的,用M(dtmp1)表示Q点梯度(梯度幅值),它的计算方法在上图的公式已经给出,w和(1-w)都是代表的是一个权重,是Q点到g1、g2点的距离比上g1到g2的距离。得到权重乘上g1和g2的梯度就得到了Q点的梯度。

通过比较C、Q、Z的梯度值,如果C比Q、Z都要大,则说明C点是一个极大值,就可以将C点保留下来。

4.2 方法B

由于方法A太复杂了,将它简化成方法B,将一个像素周围的8个像素分解成8个方向。在方法1中如果过了g1和g4就不需要做插值了。方法B就是判断当前的方向和这8个方向那个最近就是哪个方向。然后这个方向上除了目标像素值之外还有两个点,如图所示假如分别是A、B、C,如果目标点A比B、C的梯度都要小那么A点就是极大值点。

5、双阈值检测 

 

maxVal即max value,意思是如果算出来的梯度值比maxVal(假如是100)大,那就是边界。

所以A点是边界,如果红色线下方还有一个D点,那么就舍弃这个点,这个点的梯度值比minVal小。

如果是在minval和maxval之间,就要分开讨论了,比如C点和边界点A连接在了一起,那么C点就可以判断为一个边界点,否则比如B点就不是了

6、边缘检测效果实现

这里的80和150就是minVal和maxVal

img=cv2.imread("lena.jpg",cv2.IMREAD_GRAYSCALE)v1=cv2.Canny(img,80,150)
v2=cv2.Canny(img,50,100)res = np.hstack((v1,v2))
cv_show(res,'res')

打印结果:

 所以minVal和maxVal的设定是比较重要的,第5节中如果对minval进行调整,那么提到的D点就有可能判定为边界点,因此会提取出更多的细节。

再导入一张图片,将两个参数设置的更大一些来对比:

img=cv2.imread("car.png",cv2.IMREAD_GRAYSCALE)v1=cv2.Canny(img,120,250)
v2=cv2.Canny(img,50,100)res = np.hstack((v1,v2))
cv_show(res,'res')

打印结果:

相关文章:

openCV实战-系列教程5:边缘检测(Canny边缘检测/高斯滤波器/Sobel算子/非极大值抑制/线性插值法/梯度方向/双阈值检测 )、原理解析、源码解读

打印一个图片可以做出一个函数: def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows() 1、Canny边缘检测流程 Canny是一个科学家在1986年写了一篇论文,所以用自己的名字来命名这个检测算法,Canny边缘检测算法…...

【数据仓库】Linux、CentOS源码安装Superset

Linux、CentOS源码安装Superset步骤,遇到的各种问题。 报错问题: Linux下pip版本问题 You are using pip version 8.1.2, however version 22.2.2 is available. 解决办法: 安装python3的pip yum install python3-pip再升级 pip3 install…...

高并发网站的负载均衡设计

大型高并发网站的负载均衡设计通常包含以下方面: 1. 硬件负载均衡器 在入口使用专业的硬件F5等负载均衡器,实现流量分发,并承担第一层保护。 2. DNS轮询/一致性哈希 结合DNS,使用轮询或一致性哈希方式将请求分散到后端不同的真实服务器。 3. CDN负载均衡 针对静态资源,使用C…...

Unity C# 之 Task、async和 await 、Thread 基础使用的Task的简单整理

Unity C# 之 Task、async和 await 、Thread 基础使用的Task的简单整理 目录 Unity C# 之 Task、async和 await 、Thread 基础使用的Task的简单整理 一、Task、async和 await 、Thread 基础概念 1、线程,多线程 2、Task 3、async (await )…...

介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。

Docker是一个开放源代码的容器化平台,可以将应用程序及其依赖项打包到一个轻量级的容器中,以便在任何地方运行。以下是Docker的基本概念和优势: 基本概念: 镜像(image):Docker的基本构建块&am…...

如何提取视频的音频到手机?这个音频提取方法很简单

提取视频中的音频可以帮助您获得视频的声音部分,而无需观看整个视频。这对于那些只想听视频的声音或想将视频的声音与其他音频内容混合使用的人来说非常方便。此外,提取音频也可以为需要创建音频剪辑或混音的音频制作者提供帮助。那么怎么提取呢&#xf…...

【算法刷题之哈希表(2)】

目录 1.leetcode-454. 四数相加 II2.leetcode-383. 赎金信(1)暴力解法(2)哈希法 3.leetcode-205. 同构字符串(1)哈希法(2)直接对比查找 4.leetcode-128. 最长连续序列5.总结 1.leetc…...

如何创建和销售在线健身业务

快速轻松地创建您自己的线上健身网站! 越来越多的人在家健身,在线健身业务也随之快速增长。 虽然这个生意很红火,但是真的像看起来那么容易上手吗? 有了MemberPress,确实如此! 在这篇文章中&#xff0c…...

使用IIC进行多数据读取测试

IIC系列文章: (1)I2C 接口控制器理论讲解 (2)I2C接口控制设计与实现 (3)I2C连续读写实现 (4)使用IIC进行多数据读取测试 文章目录 前言一、control_RD_req模块二、顶层文件(IIC_control_EEPROM)三、测试文件(control_RD_req_tb)前言 使用已完成的IIC模块,将256个数据写入…...

drools8尝试(加单元测试)

drools8的maven模板项目里没有单元测试, 相比而言drools7有个非常好的test senorios 那就自己弄一个 文件是.http后缀的,写了个简单的例子如下 //测试交通违章 POST http://localhost:8080/Traffic Violation accept: application/json Content-Type: application/json{&q…...

Web3和去中心化:互联网的下一个演化阶段

文章目录 Web3和去中心化的定义Web3:去中心化: 为什么Web3和去中心化如此重要?数据隐私和安全:去中心化的创新:去除中间商: Web3和去中心化的应用领域去中心化金融(DeFi)&#xff1a…...

stm32 之20.HC-06蓝牙模块

原理图显示使用usart3串口使用的是PB10和PB11引脚 直接配置usart3串口协议 void usart3_init(uint32_t baud) {GPIO_InitTypeDef GPIO_InitStructureure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;//端口B硬件时钟打开RCC_AHB1PeriphClockC…...

[技术杂谈]macOS上todesk无法远程操作鼠标键盘

远程到被控Mac后能看到画面,鼠标键盘操作无反应 远程后发现画面显示正常,但是键盘和鼠标的操作没有响应 可能是辅助功能没有勾选ToDesk_Session的权限。 可按以下步骤操作: 1> 在左上角点击苹果图标,选择“系统偏好设置” …...

【C++设计模式】用简单工厂模式实现按汽车重量输出汽车类型

2023年8月24日&#xff0c;周四凌晨 #include<iostream>class CarType{ public:virtual std::string getType()0; };class MiniCar:public CarType{ public:std::string getType() override{return "小型车";}; };class MidSizeCar:public CarType{ public:std…...

【Ubuntu20.04安装Nvidia驱动、CUDA和CUDNN】

Ubuntu20.04安装Nvidia驱动、CUDA和CUDNN 1 Nvidia驱动安装1.1 安装1.2 安装Nvidia可能会遇到的问题1.2.1 NVIDIA 驱动与 Nouveau 驱动不兼容1.2.2 ERROR: Unable to find the development tool cc 2 CUDA安装2.1 下载和安装2.2 配置CUDA环境 3 安装CUDNN4 切换CUDA版本 1 Nvid…...

[Python进阶] 类的设计模式

4.11 设计模式 在Python中&#xff0c;类的设计模式是指一种通用的解决方案或设计模板&#xff0c;针对特定的问题或需求构建类结构&#xff0c;并提供相关的方法和属性。这些设计模式可以帮助开发人员遵循最佳实践、提高代码质量、增强可读性、降低维护成本。 需要注意的是&a…...

设计模式 07 桥接模式

桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型模式 概述 桥接模式是将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立地变化。它是一种对象结构型模式&#xff0c;又称为柄体&#xff08;Handle and Body&#xff09;模式或接口&#xff08;Interface&…...

linux系统(centos、ubuntu、银河麒麟服务、uos、deepin)判断程序是否已安装,通用判断方法:使用所有应用和命令的判断

前言 项目中需要判断linux服务器中是否已经安装了某个服务 方法有很多种&#xff0c;但是很多都不通用&#xff0c; 脚本代码就不容易做成统一的 解决方案 用下面的脚本代码去进行判断 用jdk测试 脚本意思如下&#xff1a; 输入java -version命令&#xff0c;将返回的字…...

机器学习各算法优缺点汇总

链接: (链接: link)...

手把手教你部署Jenkins教程,小白也能学会(多图预警)!

背景 公司的前端、后端构建及部署工作都是人工去做&#xff0c;随着业务扩大&#xff0c;项目迭代速度变快&#xff0c;人员增多&#xff0c;各种问题都暴露出来&#xff0c;将通过一个简单案例分享一下基于Jenkins的前后端自动化工作流搭建的过程&#xff0c;搭建完这套工作流…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...