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

基于MATLAB图像中的圆形目标识别和标记

一、前言

       在数字图像处理中,有些图像类别可以使用圆形度进行区分。圆度有时被称为圆形度,其定义为:圆度 = 4πA / P²,其中A是面积,P是周长。这个公式的来源是,对于圆来说,这个值等于1,因为圆的周长P=2πr,面积A=πr²,代入得4π*(πr²)/(4π²r²)=1。而对于其他形状,这个值小于1,越接近1,说明形状越接近圆。这个可能是一个标准化的圆度指标,称为圆形度或圆度系数。例如,正方形的面积是a²,周长是4a,所以圆度为4πa²/(4a)^2 =4πa²/(16a²)=π/4≈0.7854。所以这个值越接近1,形状越圆,而正方形的圆度是π/4,约0.785。下面示例说明如何使用对彩色图像进行处理,根据对象的圆度对其进行分类。

二、程序代码

%确定图像中的圆形目标( 主要用了圆形度参数进行测量)-该题综合性较强建议同学们进行练习并总结

close all;
clear all;
clc;
I = imread('pillsetc.png'); %读取MATLAB内置图像
figure(1),imshow(I);         %显示原始彩色图像

I2 = rgb2gray(I);%彩色图像转灰度图像

bw = imbinarize(I2);%图像二值化

figure(2),imshow(bw)

bw = bwareaopen(bw,30);%数字形态学处理:删除包含少于 30 个像素的所有对象

figure(3),imshow(bw);

se = strel('disk',2);     %设置圆盘结构元素

bw = imclose(bw,se);%闭运算(先膨胀后腐蚀)

figure(4),imshow(bw);

bw = imfill(bw,'holes'); %填充孔洞

figure(5),imshow(bw);

%% IV.寻找边界

[B,L] = bwboundaries(bw,'noholes');%边界提取-只关注外边界

figure(6),imshow(label2rgb(L,@jet,[.5 .5 .5]))%标记矩阵L转化为RGB图像

hold on

for k = 1:length(B)

  boundary = B{k};

  plot(boundary(:,2),boundary(:,1),'w','LineWidth',2);%绘制白色边界线

end

%% V.判断圆形

stats = regionprops(L,'Area','Centroid');%测量图像区域的属性(实际像素数和质心)

threshold = 0.94;%阈值

% 边界循环

for k = 1:length(B)

boundary = B{k};%获取标签“k”对应的(X,Y)边界坐标

    %计算物体的近似周长

delta_sq = diff(boundary).^2;

perimeter = sum(sqrt(sum(delta_sq,2)));


area = stats(k).Area;%计算标签‘k’对应的面积

metric = 4*pi*area/perimeter^2;%计算圆度-圆的圆度为1

metric_string = sprintf('%2.2f',metric);%显示结果

    %如果圆度大于阈值threshold,则用黑色圆圈表示(代表为圆)

if metric > threshold

        centroid = stats(k).Centroid;
%  plot(centroid(1),centroid(2),'ko');
%  plot(centroid(1),centroid(2),'k+');%在圆心用十字线显示
 plot(centroid(1),centroid(2),'w+');%在圆心用白色的十字线显示
    end

  
    text(boundary(1,2)-35,boundary(1,1)+13,metric_string,'Color',...
        'y', 'FontSize',14,'FontWeight','bold')  %在边界左侧显示圆度
end

title('指标越接近1代表越接近圆形');

三、运行结果

  如果大家觉得本文对大家学习和研究有所帮助,请点赞和关注,欢迎转发!

 

http://www.dtcms.com/a/172417.html

相关文章:

  • MCUboot 中的 BOOT_SWAP_TYPE_PERM 功能介绍
  • 2048游戏(含Python源码)
  • 大模型推理--从零搭建大模型推理服务器:硬件选购、Ubuntu双系统安装与环境配置
  • 定位理论第一法则在医疗AI编程中的应用
  • 【PaaS与AI融合】MLOps平台的架构设计
  • 【MCP Node.js SDK 全栈进阶指南】专家篇(1):MCP-SDK扩展与定制
  • 【实验笔记】Kylin-Desktop-V10-SP1麒麟系统知识 —— 开机自启Ollama
  • 软考 系统架构设计师系列知识点之杂项集萃(54)
  • 《Python星球日记》第31天:Django 框架入门
  • JAVA设计模式——(十一)建造者模式(Builder Pattern)
  • 计算机视觉与深度学习 | 图像匹配算法综述
  • 【AI论文】像素修补师(PixelHacker):具有结构和语义一致性的图像修复(Image Inpainting)
  • Redis数据结构ZipList,QuickList,SkipList
  • linux、window安装部署nacos
  • MinIO实现https访问
  • 全局过滤器与局部过滤器: Vue中的文本格式化工具
  • Linux中web服务器的部署及优化
  • 网络安全自动化:找准边界才能筑牢安全防线
  • 2024年408真题及答案
  • 学习路线(机器人软件架构)
  • Linux的web服务器的部署及优化
  • 在 Win10 上如何安装 WSL 2 ?
  • Serverless
  • 网狐飞云娱乐三端源码深度实测:组件结构拆解与部署Bug复盘指南(附代码分析)
  • 告别散乱的 @ExceptionHandler:实现统一、可维护的 Spring Boot 错误处理
  • 字符串匹配 之 拓展 KMP算法(Z算法)
  • 如何选择合适的光源?
  • 【阿里云大模型高级工程师ACP学习笔记】2.9 大模型应用生产实践 (下篇)
  • Python异步编程进阶:深入探索asyncio高级特性
  • 在Ubuntu系统中安装桌面环境