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

Python----计算机视觉处理(Opencv:图像边缘检测:非极大值抑制,双阈值筛选)

一、 高斯滤波

        边缘检测本身属于锐化操作,对噪点比较敏感,所以需要进行平滑处理。这里使用的是一个5*5的高斯 核对图像进行消除噪声。

二、计算图像的梯度和方向

三、非极大值抑制

        在得到每个边缘的方向之后,其实把它们连起来边缘检测就算完了,经过第二步得到的边缘不经过处理是没办法使用的,因为高斯滤波的原因,边缘会变得模糊,导 致经过第二步后得到的边缘像素点非常多,因此我们需要对其进行一些过滤操作,而非极大值抑制就是 一个很好的方法,它会对得到的边缘像素进行一个排除,使边缘尽可能细一点。

        在该步骤中,我们需要检查每个像素点的梯度方向上的相邻像素,并保留梯度值最大的像素,将其他像 素抑制为零。假设当前像素点为(x,y),其梯度方向是0°,梯度值为G(x,y),那么我们就需要比 较G(x,y)与两个相邻像素的梯度值:G(x-1,y)和G(x+1,y)。如果G(x,y)是三个值里面最 大的,就保留该像素值,否则将其抑制为零。

        并且如果梯度方向不是0°、45°、90°、135°这种特定角度,那么就要用到插值算法来计算当前像素点在 其方向上进行插值的结果了,然后进行比较并判断是否保留该像素点。这里使用的是单线性插值,通过 A1和A2两个像素点获得dTmp1与dTmp2处的插值,然后与中心点C进行比较。具体的插值算法请参考图 像旋转实验。

四、 双阈值筛选

        经过非极大值抑制之后,我们还需要设置阈值来进行筛选,当阈值设的太低,就会出现假边缘,而阈值 设的太高,一些较弱的边缘就会被丢掉,因此使用了双阈值来进行筛选,推荐高低阈值的比例为2:1到 3:1之间

        当某一像素位置的幅值超过最高阈值时,该像素必是边缘像素;当幅值低于最低像素时,该像素必不是 边缘像素;幅值处于最高像素与最低像素之间时,如果它能连接到一个高于阈值的边缘时,则被认为是 边缘像素,否则就不会被认为是边缘。

        也就是说,上图中的A和C是边缘,B不是边缘。因为C虽然不超过 最高阈值,但其与A相连,所以C就是边缘。

        具体来说,对于非极大值抑制之后的图像来说,设置两个阈值threshold1和threshold2,其中 threshold1是低阈值,threshold2是高阈值。然后遍历图像,把梯度值小于低阈值的点的梯度值设为 0,得到图像1,把梯度值小于高阈值的点的梯度值设为0,得到图像2。由于图像2的阈值比较高,所以 其中会损失掉很多有用的图像信息,而图像1的阈值比较低,所以会保留很多的信息,包括真正的边缘和虚假的边缘。

        那么我们就可以以图像2为基础,以图像1为补充来连接图像的边缘,其具体步骤为:

•        对图像2进行遍历,当遇到一个非零的像素点P时,记录以P为开始的轮廓线,知道轮廓线的终点位 置Q。

•        考察图像1中与图像2中的Q点位置对应的点S的8邻近区域,如果在S点的8邻近区域内有非零像素存 在,就将其作为边界点放入图像2中作为点R。然后再从点R开始重复第一步,直到在图像1和图像2 中都无法继续为止。

•        当完成对包含点P的轮廓线的寻找之后,将这条轮廓线标为已寻找,然后接着寻找下一条轮廓,就 是重复第1步、第2步、第3步,直到图像2中找不到新的轮廓为止。

        经过筛选之后的所保存下来的点就是我们图像中的边缘点了

五、图像边缘检测 

5.1、有二值化

导入模块

import cv2

输入图像

img=cv2.imread('lenda01.png')

灰度化

img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

二值化

ret1,img_threshold1=cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)

高斯滤波

img_Guss1=cv2.GaussianBlur(img_threshold1,(5,5),sigmaX=1.5)

梯度与方向

非极大值抑制

双阈值筛选

img_Canny1=cv2.Canny(img_Guss1,122,127,L2gradient=True)

输出图像

cv2.imshow('img',img)
cv2.imshow('img_Canny1',img_Canny1)
cv2.waitKey(0)

完整代码 

import cv2  img = cv2.imread('lenda01.png')  # 将图像从BGR颜色空间转换为灰度图像  
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 使用全局阈值进行二值化处理  
#   - ret1:  计算得到的阈值 (127)  
#   - img_threshold1:  二值化后的图像,像素值大于127设置为255,否则设置为0  
ret1, img_threshold1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)  # 使用 Otsu's 阈值法进行二值化处理,并进行反转  
#   - ret2:  Otsu's算法计算得到的阈值  
#   - img_threshold2:  二值化后的图像,像素值小于阈值设置为255,否则设置为0  
ret2, img_threshold2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV)  # 对二值化后的图像进行高斯模糊处理,以减少噪声  
#   - img_threshold1:  输入图像(二值化后的图像)  
#   - (5, 5):  高斯核的大小  
#   - sigmaX=1.5:  X方向上的高斯核标准差  
img_Guss1 = cv2.GaussianBlur(img_threshold1, (5, 5), sigmaX=1.5)  # 使用 Canny 边缘检测算法提取图像的边缘  
#   - img_Guss1:  输入图像(高斯模糊后的二值化图像)  
#   - ret2:  低阈值,用于边缘检测的阈值下限 (这里使用Otsu算法计算得到的阈值)  
#   - ret1:  高阈值,用于边缘检测的阈值上限 (这里使用固定阈值127)  
#   - L2gradient=True:  使用 L2 范数计算图像梯度,更准确  
img_Canny1 = cv2.Canny(img_Guss1, ret2, ret1, L2gradient=True)  # 显示原始图像  
cv2.imshow('img', img)  
# 显示 Canny 边缘检测后的图像  
cv2.imshow('img_Canny1', img_Canny1)  
# 等待用户按下键盘上的任意键  
cv2.waitKey(0)  

5.2、无二值化 

import cv2img = cv2.imread('lenda01.png')# 将图像从BGR颜色空间转换为灰度图像
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 使用全局阈值进行二值化处理
#   - ret1:  计算得到的阈值 (127)
#   - img_threshold1:  二值化后的图像,像素值大于127设置为255,否则设置为0
ret1, img_threshold1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)# 使用 Otsu's 阈值法进行二值化处理,并进行反转
#   - ret2:  Otsu's算法计算得到的阈值
#   - img_threshold2:  二值化后的图像,像素值小于阈值设置为255,否则设置为0
ret2, img_threshold2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV)# 对灰度图像进行高斯模糊处理,以减少噪声
#   - (5, 5):  高斯核的大小
#   - sigmaX=1.5:  X方向上的高斯核标准差
img_Guss2 = cv2.GaussianBlur(img_gray, (5, 5), sigmaX=1.5)# 使用 Canny 边缘检测算法提取图像的边缘
#   - img_Guss2:  输入图像(高斯模糊后的灰度图像)
#   - ret2:  低阈值,用于边缘检测的阈值下限
#   - ret1:  高阈值,用于边缘检测的阈值上限
#   - L2gradient=True:  使用 L2 范数计算图像梯度,更准确
img_Canny2 = cv2.Canny(img_Guss2, ret2, ret1, L2gradient=True)# 显示原始图像
cv2.imshow('img', img)
# 显示 Canny 边缘检测后的图像
cv2.imshow('img_Canny2', img_Canny2)
# 等待用户按下键盘上的任意键
cv2.waitKey(0)
```

六、库函数

Canny()

使用 Canny 算法查找图像中的边缘

该函数在输入图像中查找边缘,并使用 Canny 算法在输出映射边缘中标记它们。threshold1 和 threshold2 之间的最小值用于 Edge 链接。最大值用于查找强边缘的初始分段。查看 http://en.wikipedia.org/wiki/Canny_edge_detector

cv.Canny(	image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]]	) ->	edges
cv.Canny(	dx, dy, threshold1, threshold2[, edges[, L2gradient]]	) ->	edges
方法描述
image8 位输入图像。
edges输出边缘映射;单通道 8 位图像,其大小与 图像 相同。
threshold1磁滞过程的第一个阈值。
threshold2滞后程序的第二个阈值。
apertureSize孔径大小。
L2gradient
dx输入图像的 16 位 x 导数(CV_16SC1 或 CV_16SC3)
dy输入图像的 16 位 y 导数(与 dx 类型相同)。

相关文章:

Python----计算机视觉处理(Opencv:图像边缘检测:非极大值抑制,双阈值筛选)

一、 高斯滤波 边缘检测本身属于锐化操作,对噪点比较敏感,所以需要进行平滑处理。这里使用的是一个5*5的高斯 核对图像进行消除噪声。 二、计算图像的梯度和方向 三、非极大值抑制 在得到每个边缘的方向之后,其实把它们连起来边缘检测就算完了…...

vue3(笔记)5.0--pinia工具的知识扩展

pinia工具 defineStore(创建pinia) 作用:用于定义一个 Pinia store。 用法: 接收一个唯一的 ID 和一个配置对象,配置对象中可以定义 state、getters 和 actions。state 是一个函数,返回初始状态。getters 类似于 Vue 组件中的计…...

基于Kubernetes部署Prometheus监控平台

#作者:stackofumbrella 文章目录 prometheus和k8s集群版本对照表架构Prometheus Operator简介kube-prometheus下载地址 安装修改镜像地址修改Prometheus的service修改Grafana的service修改Alertmanager的service数据持久化执行安装 Prometheus验证Grafana验证解决C…...

往期项目shader着色器实践效果应用合集

1、管路混色 2、水管水流效果 3、水管流入到流完效果 4、加热冷却 两 色混色 示意 XX、毒蘑菇测试效果...

如何在 React 项目中使用React.lazy和Suspense实现组件的懒加载?

大白话如何在 React 项目中使用React.lazy和Suspense实现组件的懒加载? 在 React 项目里,有时候组件功能多、体积大,要是一次性把所有组件都加载进来,网页加载速度就会变慢。而 React 提供了 React.lazy 和 Suspense 这两个好东西…...

绿色暴政:Relax Max如何用军工科技定义环保新标准

《绿色暴政:Relax Max如何用军工科技定义环保新标准》 ——从隐形战斗机涂层到零碳卫浴的降维打击 (洛克希德马丁实验室,2023年)当F-35战斗机的隐形涂料配方被改写为卫浴釉料时,环保产业迎来了最硬核的颠覆者。Relax…...

蓝桥杯刷题 Day 4 栈与链表

蓝桥杯刷题 Day 4 栈与链表 文章目录 蓝桥杯刷题 Day 4 栈与链表前言一、栈1. 解题思路2. 拆解代码(不复杂,不拆了) 二、链表1. 解题思路1.1 主函数1.2 自定义列表类1.2.1 插入操作1.2.2 删除操作1.2.3 按要求输出 三、 题后收获3.1 知识点 前…...

第十三届蓝桥杯单片机省赛程序设计试题

目录 试题 各程序块代码 init.c main.c other.h other.c key.c seg.c onewire.c部分 ds1302.c部分 试题 各程序块代码 init.c #include "other.h"void init74hc138(unsigned char n){P2(P2&0x1f)|(n<<5);P2&0x1f; } void init(){P00x00;in…...

QOpenGLWidget动态加载功能实现教程(Qt+OpenGL)

QOpenGLWidget动态加载功能实现教程 我需要在Qt里面使用QOpenGLWidget显示OpenGL窗口&#xff0c;并且需要实现加载模型后重新渲染更新窗口的功能&#xff0c;但是一直无法更新被卡住了&#xff0c;现在把问题解决了总结一下整个实现过程。 创建一个自己的OpenGLWidget类 QOp…...

机器学习正则化技术:Ridge、Lasso与ElasticNet全解析

机器学习中的正则化技术 在机器学习中&#xff0c;正则化技术&#xff08;如 Ridge 和 Lasso&#xff09;主要用于解决过拟合问题&#xff0c;通过限制模型复杂度提高泛化能力。以下是详细说明及实例代码&#xff1a; 一、正则化解决的问题 过拟合&#xff1a;模型在训练集表…...

数字转换(c++)

【题目描述】 如果一个数 xx 的约数和 yy &#xff08;不包括他本身&#xff09;比他本身小&#xff0c;那么 xx 可以变成 yy &#xff0c;yy 也可以变成 xx 。例如 44 可以变为 33 &#xff0c;11 可以变为 77 。限定所有数字变换在不超过 nn 的正整数范围内进行&#xff0c;…...

ESP32驱动BMP280和MQ4传感器

文章目录 前言 一、硬件准备 所需组件 连接方式&#xff1a; 二、软件实现 1.所需库 2.代码实现 效果演示 三、上传Qt端 前言 在物联网和环境监测应用中&#xff0c;传感器是获取环境数据的关键组件。本文将详细介绍如何使用ESP32微控制器同时驱动BMP280大气压力传感器…...

洛谷题单1-B2002 Hello,World!-python-流程图重构

题目描述 编写一个能够输出 Hello,World! 的程序。 提示&#xff1a; 使用英文标点符号&#xff1b;Hello,World! 逗号后面没有空格。H 和 W 为大写字母。 输入格式 无 输出格式 无 输入输出样例 #1 输入 #1 无输出 #1 Hello,World!方式-print() 代码 class Solut…...

MQTT协议笔记

消息格式 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的消息协议&#xff0c;专为低带宽、高延迟或不可靠的网络设计&#xff0c;广泛应用于物联网&#xff08;IoT&#xff09;设备之间的通信。MQTT消息体的结构遵循MQTT协议规范&#xff0…...

CentOS系统下安装tesseract-ocr5.x版本

CentOS系统下安装tesseract-ocr5.x版本 安装依赖包&#xff1a; yum update -y yum install autoconf automake libtool libjpeg-devel libpng-devel libtiff-devel zlib-devel yum install automake libtool bzip2 -y手动编译安装GCC&#xff08;因系统默认安装的GCC版本比较…...

“征服HTML引号恶魔:“完全解析手册”!!!(quot;表示双引号)

&#x1f6a8;&#x1f4e2; "征服HTML引号恶魔&#xff1a;“完全解析手册” &#x1f4e2;&#x1f6a8; &#x1f3af; 博客引言&#xff1a;当引号变成"恶魔" &#x1f631; 是否遇到过这种情况&#xff1a; 写HTML时满心欢喜输入<div title"他…...

如何使用VS中的Android Game Development Extension (AGDE) 来查看安卓 Logcat 日志

一、首先按照以下 指引 中的 第1、2步骤&#xff0c;安装一下 AGDE &#xff0c;AGDE 的安装包可以在官网上找到。 UE4 使用AndroidGameDevelopmentExtension&#xff08;AGDE&#xff09;对安卓客户端做“断点调试”与“代码热更”-CSDN博客 在执行第二步骤前&#xff0c;记得…...

VSCode 生成HTML 基本骨架

在VSCode 新建html文件中敲一个英文感叹号 ! <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…...

【Spring AI】基于专属知识库的RAG智能问答小程序开发——功能优化:用户鉴权相关工具类代码

系列文章目录 【Spring AI】基于专属知识库的RAG智能问答小程序开发——完整项目&#xff08;含完整前端后端代码&#xff09;【Spring AI】基于专属知识库的RAG智能问答小程序开发——代码逐行精讲&#xff1a;核心ChatClient对象相关构造函数【Spring AI】基于专属知识库的R…...

Solr-搜索引擎-入门到精通

以下是对 Apache Solr 的简介及其常用语法的快速入门指南&#xff1a; 一、Solr 是什么&#xff1f; • 核心定位&#xff1a;Apache Solr 是一个基于 Lucene 的高性能、开源的搜索平台&#xff0c;支持全文检索、分词、高亮、聚合统计等功能。 • 核心功能&#xff1a; • 全…...

07_GRU模型

GRU模型 双向GRU笔记:https://blog.csdn.net/weixin_44579176/article/details/146459952 概念 GRU&#xff08;Gated Recurrent Unit&#xff09;也称为门控循环单元&#xff0c;是一种改进版的RNN。与LSTM一样能够有效捕捉长序列之间的语义关联&#xff0c;通过引入两个&qu…...

【字符设备驱动开发–IMX6ULL】(二)Linux 设备号

【字符设备驱动开发–IMX6ULL】&#xff08;二&#xff09;Linux 设备号 文章目录 【字符设备驱动开发–IMX6ULL】&#xff08;二&#xff09;Linux 设备号1 设备号的组成2.设备号的分配 1 设备号的组成 为了方便管理&#xff0c;Linux 中每个设备都有一个设备号&#xff0c;设…...

【大模型基础_毛玉仁】3.4 Prompt 技巧

目录 3.4 Prompt 技巧3.4.1 规范Prompt 编写1&#xff09;任务说明要明确2&#xff09;上下文丰富且清晰3&#xff09;输出格式要规范4&#xff09;排版要清晰 3.4.2 合理归纳提问1&#xff09;复杂问题拆解2&#xff09;追问 3.4.3 适时使用CoT1&#xff09;何时使用CoT2&…...

探索PyMOL新插件NRGSuite-Qt:全面提升分子对接、结合位点预测与动力学模拟的研究效率

随着分子建模和计算生物学的快速发展&#xff0c;分子对接&#xff08;Molecular Docking&#xff09;、结合位点预测、相互作用分析以及动力学研究等领域的工具越来越重要。这些工具不仅帮助研究人员理解分子间的相互作用机制&#xff0c;还能加速药物设计和优化过程。NRGSuit…...

sql2022 复制 事务级别发布后无法删除

Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission. 用SA用户登录执行下列语句 USE [xxxxx] GO EXEC dbo.sp_changedbowner loginame Nsa, …...

wokwi arduino mega 2560 - 键盘与LCD显示

截图&#xff1a; 链接&#xff1a; https://wokwi.com/projects/414520193913760769 代码&#xff1a; //cslg lcd key #include <LiquidCrystal.h> // 引入LiquidCrystal库&#xff0c;用于LCD显示 #include <Keypad.h> // 引入Keypad库&#xff0c;用于键盘输…...

Linux设置SSH免密码密钥登录

文章目录 设置SSH免密码密钥登录第一步&#xff1a; 生成SSH密钥对&#xff08;在客户端操作&#xff09;方式一&#xff1a;Windows 10/11 内置的 OpenSSH 客户端&#xff08;推荐&#xff09;常用选项&#xff1a;密钥算法选择建议生成秘钥 方式二&#xff1a;借用Xshell工具…...

深度剖析HTTP协议—GET/PUT请求方法的使用-构造请求的方法

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…...

GPU算力哪家好?GpuGeek推出高性能GPU云服务

在人工智能和深度学习领域&#xff0c;GPU算力租赁已成为推动技术创新的关键因素。随着越来越多的企业和个人开发者投身于AI研究和应用开发&#xff0c;如何高效、灵活地获取GPU算力成为了一个亟待解决的问题。GpuGeek作为一站式AI基础设施平台&#xff0c;凭借其独特的优势&am…...

蓝桥杯算法实战分享

蓝桥杯算法实战分享 蓝桥杯是国内知名的程序设计竞赛&#xff0c;涵盖算法、数据结构、编程技巧等多个领域。本文将从实战角度分享蓝桥杯算法竞赛的常见题型、解题思路和优化技巧&#xff0c;帮助参赛者更好地备战。 1. 常见题型与解题思路 蓝桥杯的题型主要包括以下几类&…...