基于matlab自动检测图像中的圆形目标并可视化检测到的圆(附源码)

news2024/11/16 9:35:31

一、前言

此示例说明如何自动检测图像中的圆或圆形目标并可视化检测到的圆。

二、实现步骤

步骤 1:加载图像

读取并显示包含各种颜色的圆形塑料片的图像。除了有大量要检测的圆之外,从圆检测的角度来看,此图像还有一些有趣的特点:

  1. 有不同颜色的塑料片,它们相对于背景有不同对比度。一方面,蓝色和红色塑料片在此背景上形成强烈的对比。另一方面,一些黄色塑料片与背景的对比不明显。

  2. 请注意一些塑料片重叠在一起,而另一些塑料片则靠得很近,几乎互相接触。对于目标检测来说,场景中存在重叠的对象边缘和对象遮挡通常具有挑战性。

步骤 2:确定搜索圆的半径范围

使用 drawline 函数找到合适的圆半径范围。在塑料片的近似直径上绘制一条线。

线 ROI 的长度就是塑料片的直径。通常的塑料片的直径在 40 到 50 个像素的范围内。

步骤 3:寻找圆的初步尝试

imfindcircles 函数搜索符合半径范围的圆。搜索半径在 20 到 25 个像素范围内的圆。在此之前,最好要清楚对象是比背景亮还是比背景暗。

背景相当亮,大多数塑料片比背景暗。但是,默认情况下,imfindcircles 会找到比背景亮的圆形目标。因此,在 imfindcircles 中将参数“ObjectPolarity”设置为“dark”以搜索较暗的圆。

请注意,输出 centers 和 radii 为空,这意味着未找到圆。这种情况经常发生,因为 imfindcircles 是圆形检测器,与大多数检测器类似,imfindcircles 有内部检测阈值决定其敏感度。简而言之,这意味着检测器对某个(圆形)检测的信心必须大于某个水平,才将其视为有效检测。imfindcircles 有参数“Sensitivity”,可用于控制此内部阈值,从而控制算法的敏感度。“Sensitivity”值越高,检测阈值设置得越低,并导致检测到更多圆。这类似于家庭安全系统中使用的运动检测器的敏感度控制。

步骤 4:提高检测敏感度

回到塑料片图像,在默认敏感度水平下,可能所有圆都低于内部阈值,因此未检测到圆。“Sensitivity”是介于 0 和 1 之间的数字,默认设置为 0.85。将“Sensitivity”提高到 0.9。这次,imfindcircles 发现了一些圆 - 准确地说是八个。centers 包含圆心的位置,radii 包含这些圆的估计半径。

步骤 5:在图像上绘制圆

函数 viscircles 可用于在图像上绘制圆。来自 imfindcircles 的输出变量 centers 和 radii 可以直接传递给 viscircles

圆心似乎定位正确,它们对应的半径似乎与实际塑料片匹配良好。但仍未检测到相当多的塑料片。请尝试将“Sensitivity”提高到 0.92。

增加“Sensitivity”会让我们找到更多圆。再次在图像上绘制这些圆。

步骤 6:使用第二种方法(两阶段)寻找圆

此方法的结果看起来更好。imfindcircles 有两种不同寻找圆的方法。到当前为止,默认方法(称为相位编码方法)用于检测圆。在 imfindcircles 中还可以使用另一种方法,通常称为两阶段方法。使用两阶段方法并显示结果。

两阶段方法使用敏感度 0.92 检测更多圆。一般来说,这两种方法是互补的,因为它们有不同优点。相位编码方法通常比两阶段方法更快,抗噪声的稳定性稍强。但是,它也可能需要更高的“Sensitivity”水平才能实现与两阶段方法相同数量的检测。例如,如果“Sensitivity”水平提高到 0.95,相位编码方法也会找到相同的塑料片。

请注意,imfindcircles 中的两种方法都能准确找到部分可见(遮挡)塑料片的中心和半径。

步骤 7:为什么有些圆仍检测不到?

查看最后一个结果,很奇怪 imfindcircles 没有在图像中找到黄色塑料片。黄色塑料片与背景的对比不够强烈。事实上,它们看起来和背景的强度非常相似。是不是黄色塑料片并没有想象中的那样比背景“更暗”?要确认这一点,请再次显示该图像的灰度版本。

步骤 8:在图像中找到“明亮”的圆

与背景相比,黄色塑料片的强度几乎相同,甚至更亮。因此,要检测黄色塑料片,请将“ObjectPolarity”更改为“bright”。

步骤 9:用不同颜色绘制“Bright”圆

通过更改 viscircles 中的“Color”参数,以不同颜色绘制明亮的圆。

请注意,找到了三个原先未检测到的黄色塑料片,但仍有黄色塑料片未检测到。这些黄色塑料片很难检测到,因为在这种背景下,它们没有呈现出与众不同

步骤 10:降低“EdgeThreshold”的值

在这里还可以使用 imfindcircles 中的另一个参数,即“EdgeThreshold”。要查找圆,imfindcircles 仅使用图像中的边缘像素。这些边缘像素基本上是具有高梯度值的像素。“EdgeThreshold”参数控制像素的梯度值必须有多高,才能将其视为边缘像素并包含在计算中。该参数的高值(更接近 1)只允许包含强边缘(较高梯度值),而低值(更接近 0)的宽容度更高,可在计算中包含较弱的边缘(较低梯度值)。对于检测不到黄色塑料片的情况,是因为对比度低,一些边界像素(在塑料片的圆周上)预期具有低梯度值。因此,请降低“EdgeThreshold”参数,以确保黄色塑料片的大多数边缘像素都包含在计算中。

步骤 11:同时绘制“暗”和“亮”圆

现在 imfindcircles 找到了所有黄色圆,还找到了一个绿色圆。用蓝色绘制这些塑料片,用红色绘制之前发现的其他塑料片(“ObjectPolarity”设置为“dark”)。

所有圆都被检测到。最后 - 应注意,在检测中更激进地更改参数可能会发现更多圆,但也会增加检测到假圆的可能性。需要在可找到的真圆数量(检测率)和用它们找到的假圆数量(虚警率)之间实现某种平衡。

三、程序

使用Matlab R2022b版本,点击打开。(版本过低,运行该程序可能会报错)

程序有偿获取:评论区下留言,博主看到会私信你。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/739243.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Sping Security前后端分离两种方案

前言 本篇文章是基于Spring Security实现前后端分离登录认证及权限控制的实战,主要包括以下四方面内容: Spring Seciruty简单介绍; 通过Spring Seciruty实现的基于表单和Token认证的两种认证方式; 自定义实现RBAC的权限控制; 跨域问题处理…

Django_模板继承

模板继承先创建一个父模版&#xff0c;它包含大部页面共有元素&#xff0c;并且需要定义能够被子模板覆盖的blocks标签。 extends 模板继承 通过下面的例子&#xff0c;理解模板继承的概念。 创建base.html文件&#xff0c;写入下面代码&#xff1a; <!DOCTYPE html>…

Stable Diffusion - 墨幽人造人 模型与 Tag 配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131565068 墨幽人造人模型的版本介绍&#xff1a; v1010修剪&#xff1a;更小体积的4G修剪版&#xff0c;但是整体色彩及细节表现力、好手好脸概…

结构体和数据结构--动态数据结构体-单向链表

目录 一、问题的提出 二、链表的定义 三、单向链表的建立 四、单向链表的删除操作 五、单向链表的插入操作 一、问题的提出 数组实质是一种顺序存储&#xff0c;随机访问的线性表&#xff0c;它的优点是使用直观&#xff0c;便于快速、随机地存取线性表中地任意元素。但缺…

线性表综合应用题1

线性表综合应用题1 从顺序表中删除具有最小值的元素&#xff08;假设唯一&#xff09;并由函数返回被删除元素的值。空出的位置由最后一个元素填补&#xff0c;若顺序表为空&#xff0c;则显示出错信息并退出运行。 算法思想&#xff1a;搜索整个顺序表&#xff0c;查找最小值元…

多元回归预测 | Matlab基于鲸鱼算法(WOA)优化高斯过程回归(WOA-GPR)的数据回归预测,matlab代码,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab基于鲸鱼算法(WOA)优化高斯过程回归(WOA-GPR)的数据回归预测,matlab代码,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源…

ct.js笔记-整合SweetAlert2,弹出输入框(添加Cat模组)

如下&#xff1a; 效果如下&#xff1a; 点击Name后&#xff1a; 实现如下&#xff1a; 在ct.libs中添加个新文件夹sweetalert2文件夹。 内部要包含这几个关键文件&#xff1a; ①index.js&#xff1a;调用模组的入库文件&#xff1b; ②includes文件夹&#xff1a;把需要引…

keepalived 实现 IP 地址漂移

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

基于redis实现延时队列(二)

背景 上篇文章中使用了redis的zset定时器实现延时任务&#xff0c;虽然定时器设置为30秒执行一次&#xff0c;但是还是有时间上的差异化&#xff1b;现更换一种方式实现&#xff0c;可以避免时间上的差异。 redis的key过期回调事件&#xff0c;也能达到延迟队列效果 配置修改…

抖音短视频seo矩阵源码开源SaaS部署(四)

目录 一、 抖音短视频SEO矩阵包括以下内容&#xff1a; ​编辑 二、 源码开源部署流程 三、 SaaS的理解 四、 抖音短视频seo&#xff0c;SaaS矩阵部署用到的技术 抖音短视频SEO主要是通过以下几个方面实现的&#xff1a; SaaS矩阵部署主要用到的技术包括以下几个方面&…

深蓝学院C++基础与深度解析笔记 第 11 章 类

深蓝学院C基础与深度解析笔记 第 11 章 类 1. 结构体与对象聚合 **● 结构体&#xff1a;**对基本数据结构进行扩展&#xff0c;将多个对象放置在一起视为一个整体 – 结构体的声明与定义&#xff08;注意定义后面要跟分号来表示结束&#xff09; – 仅有声明的结构体是不完全…

【Linux后端服务器开发】共享内存

目录 一、共享内存概述 二、共享内存&#xff08;IPC资源&#xff09;的查看——ipcm 三、共享内存的创建——shmget 四、共享内存的控制&#xff08;删除&#xff09;——shmctl 五、共享内存的关联——shmat 六、共享内存去关联——shmdt 七、进程间通信 一、共享内存…

力扣 -- 309. 最佳买卖股票时机含冷冻期

题目链接&#xff1a;309. 最佳买卖股票时机含冷冻期 - 力扣&#xff08;LeetCode&#xff09; 下面是用动态规划的思想解决这道题的过程&#xff0c;相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 参考代码&#xff1a; class Solution { public:int maxProfit(vec…

基于matlab使用深度神经网络对肿瘤图像进行分类(附源码)

一、前言 此示例演示如何使用 Inception-v3 深度神经网络对可能不适合内存的多分辨率全玻片图像 &#xff08;WSI&#xff09; 进行分类。 用于肿瘤分类的深度学习方法依赖于数字病理学&#xff0c;其中整个组织切片被成像和数字化。生成的 WSI 具有高分辨率&#xff0c;大约…

Openlayers实战:平移、弹性平移、飞行动画

Openlayers地图上经常会遇到这样的一种 场景,获取到某数据后,会重新定位中心点到某个位置,这里可以用setCenter([lon,lat]), 更可以用动画的形式展现。 在本实战中,展示出平移、弹性平移、飞行的动画。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还是大剑…

【图像处理OpenCV(C++版)】——5.5 图像平滑之双边滤波

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义&#xff0c;适用于平时学习、工作快…

第三十六天 Java基础学习(三十)

一、Spring MVC 组件是将处理某类问题的代码进行封装的整体模块。一个大的问题可以拆分为不同的小问题&#xff0c;解决每个小问题的代码封装可以称之为组件&#xff0c;但是组件又是无法独立运行的&#xff0c;必须结合其他组件一起才能最终解决问题。就好比汽车&#xff0c;…

同步任务和异步任务的执行过程

同步任务和异步任务的执行过程 1、执行过程描述2、EventLoop的概念 1、执行过程描述 同步任务 是由JS主线程按次序执行异步任务委托给宿主环境执行已完成的异步任务对应的回调函数&#xff0c;会被加入到任务队列中等待执行JS的主线程的执行栈被清空后&#xff0c;会读取任务队…

Java026——System 类和Scanner 类

一、System 类 1.1、System 类提供的常用方法 方法 功能描述 ----------------------------------------------------------------------------------------------------------------------- currentTimeMillis() 返回当前计算机时间 和 格林威治时间&#xff…

mysql查询练习

1.创建表 CREATE TABLE worker( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL,工资 float(8,2) NOT NULL,政治面貌 varchar(10) NOT NULL DEFAULT 群众 , 姓名 varchar(20) NOT NULL,出生日期 date NOT NULL,PRIMARY KEY (职工号))ENGINE…