华南农业大学|图像处理与分析技术综合设计|题目解答:定位数显区域并分离电表数字

设计任务

图 28 是一幅正在运行的数字电表图像(ipa28.jpg),试采用图像处理与分析

技术,设计适当的算法和程序,找出电表的数显区域,计算目标区域的长宽比

和像素面积;并提取其中面积最大的 6 个数字字符。请按统一要求写出算法原

理、设计流程,并完成程序测试与分析等内容。

算法设计

解题思路

运用阈值分割、开运算、取反等方法,使图像只剩下液晶显示屏上的数字和背景作为连通域;运用膨胀,使液晶显示屏上的每个数字都合成独立的一个连通域。之后只需找最小的6个连通域即可提取出数字。

设计方案说明

先把图片转换为灰度图G,再进行阈值分割,条件为强度>200,得到二值图BW。此时液晶显示屏上数字区域的像素值都是0,使用较大阈值作用于bwareaopen函数(可以去掉小于某个面积的连通域),可以去掉一些比较亮的大区域,得到BW1。之后对BW1取反,使用小阈值作用于bwareaopen函数,去掉一些比较暗的区域,得到BW2。还有一些区域和数字的亮度接近,但是又比最小的数字的一部分(数字1的上部)大,所以进行膨胀操作,使数字连通成一个整体,得到BW3。再进行开运算,可以去掉不关心的区域,得到得到只有6个数字以及数显区域外面构成的7个连通域的BW4。将取反后的BW4作用于regionprops函数,可以得到数显区域的边界框,通过函数返回的结构体里Area、BoundingBox属性,可以得到包围区域的面积以及计算出长宽比。然后将BW4应用于bwlabel,提取出表示数字的连通区域即可。

关键算法的设计原理

阈值分割:数显屏幕较亮,对于灰度图,取强度>某较大值进行阈值分割,可以在液晶屏中清楚分割数字、字符与屏幕,同时可以去掉一些强度为阈值以下的元素。

开运算:各个连通域组成的像素面积有差异,可以通过取反操作灵活进行以面积为阈值的开运算,去除不关心元素。

膨胀:对于液晶屏上显示的数字字符,其类似于七段数码管,“每段数码管”之间间隙小,可以选取适当大小的方形结构元素,膨胀使得“每段数码管”相连。

计算长宽比(宽高比):使用工具函数返回的长与宽(宽与高)计算。

算法步骤

图1

算法步骤如图1,与程序流程完全一致。

程序设计

算法名称:阈值分割、开运算、取反、膨胀、边界框包围连通域、连通域分析

工具函数

阈值分割:I_gray > 200,其中I_gray为原图像经灰度转换得到的灰度图。

开运算:bwareaopen。作用是去掉像素面积为某个阈值以下的连通域。

取反:~。

膨胀:strel函数和imdilate函数。

边界框包围连通域:regionprops。返回stats的BoundingBox字段中有四个属性,依次是矩形框左上角y坐标、矩形框左上角x坐标、矩形框宽(即题目中的长)、矩形框高(即题目中的宽)。

连通域分析:使用bwlabel函数,返回连通域的标签L和连通域总数num。

设计分析符合题目要求。使用matlabr2020b版本。由于使用算法简单有效步骤少,时间复杂度O(I),空间复杂度O(I)(I为给定图像素数目),系统性能良好。

测试分析:

图2

图2从左到右,为原图→灰度图→阈值分割后图(阈值200)。

图3

图3从左到右,分别为开运算后图(阈值5000)→取反后开运算图(阈值255)→腐蚀后图(结构元素取12*5的矩形)→开运算后图(阈值1000)。

图4

图4为识别到数显区域的框图,准确度高。

图5

图5为各连通区域标注图。可看出图中有7个连通区域,取6个较小的连通区域,保存输出如图6~图11。满足要求。

  

                                             图6                                                     图7

  

                                             图8                                                     图9

  

                                             图10                                                     图11

图12

图12为数显区域长宽比和像素面积的结果,满足要求。

特点和优势:算法简单有效。

存在的问题和不足:边界框识别没有完全框住数显区域,可以使用透视变换优化。

代码

clc,clear%% step1 -- 预处理
I = imread('ipa28.jpg');  
I_gray = rgb2gray(I);  
BW = I_gray > 200; % 阈值分割%% step2 -- 开运算,去除不关心的元素
BW1 = bwareaopen(BW, 5000);  % 假设小于5000像素的物体为噪声
BW2 = bwareaopen(~BW1,255);%% step3 -- 膨胀图像,使数码管显示的数字成为一个整体
SE = strel('rectangle',[12,5]);
BW3 = imdilate(BW2, SE);%% step4 -- 开运算,再次去除不关心的元素
BW4 = bwareaopen(BW3, 1000);%% step5 -- 用边界框包围数显区域,得到像素面积计算边界框的宽高比并输出
stats = regionprops(~BW4, 'BoundingBox', 'Area');
bbox = stats.BoundingBox;
area = stats.Area;
aspect_ratio = bbox(3) / bbox(4);
disp("数显区域长宽比:"+num2str(aspect_ratio));
disp("数显区域面积:"+num2str(area));%% step6 -- 对数显区域应用连通域分析,找到所有的数字字符
[L, num] = bwlabel(BW4); % 找到所有的连通区域,并用不同的标签表示
RGB = label2rgb(L); % 将标签转换为颜色图像for k = 2:numBW_k = (L == k); % 提取第k个连通区域的像素imwrite(BW_k, sprintf('digit%d.png', k-1)); % 保存图像
end%% 
figure(1),subplot(131),imshow(I);title("原图");
subplot(132),imshow(I_gray);title("灰度图");
subplot(133),imshow(BW);title("阈值分割后图");%%
figure(2),subplot(141),imshow(BW1);title("开运算");
subplot(142),imshow(BW2);title("取反后开运算");
subplot(143),imshow(BW3);title("经过膨胀");
subplot(144),imshow(BW4);title("继续开运算");%% 画出边界框
figure(3),imshow(I);
hold on;
rectangle('Position', [bbox(1),bbox(2),bbox(3),bbox(4)], ...'EdgeColor','r','LineWidth',2); % 绘制边界框
hold off;%% 显示连通区域
figure(4),imshow(RGB); % 显示连通区域

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Service:微服务架构的应对之道

Service 的工作原理和 LVS、Nginx 差不多,Kubernetes 会给它分配一个静态 IP 地址,然后它再去自动管理、维护后面动态变化的 Pod 集合,当客户端访问 Service,它就根据某种策略,把流量转发给后面的某个 Pod。 Service 使…

Docker把公共镜像推送到harbor私服的流程(企业级)

如果构建项目时,使用了k8s docker Jenkins的模式。 那么我们在docker构建镜像时,如果需要使用了Nodejs,那么我们必须得从某个资源库中拉取需要的Nodejs。 在企业里,正常都会把自己项目涉及的库都放在harbor私服里。 下面讲一下&…

珠海电子行业实行MES系统该如何规划 mes系统供应商 先达盈致

在电子行业中,MES系统是提高生产效率、降低成本、优化生产计划的关键工具。但是,如何规划MES系统的实施才能使其大限度地提高企业的生产效率和经济效益呢? 首先,企业应该充分了解MES系统的基本概念和功能模块。MES系统中包括生产…

PowerDesigner 数据库建模使用详解

目录 一、前言 二、PowerDesigner概述 2.1 PowerDesigner核心能力 2.1.1 集成多种建模能力 2.1.2 自动生产代码能力 2.1.3 强大的逆向工程能力 2.1.4 可扩展的企业库解决方案 2.2 PowerDesigner常用的几种模型 2.2.1 概念模型 2.2.2 逻辑数据模型 2.2.3 物理模型 2.2…

华为云CodeArts Check IDE插件体验之旅

1 开发者的思考 近年来,ChatGPT的来临像一场突然出现的风暴,程序员是否马上被取代的担忧出现在媒体上了,作为软件开发小白,前不久我也陷入了这样的深思之中,但认真的想了下,ChatGPT就如自动驾驶一样&#…

详解Windows安装分布式版本控制系统git

文章目录 前言下载安装相关链接 前言 git是一个分布式版本控制软件,最初由Linux创作者Linus Torvalds创作,并于2015年以GPL许可协议发布。git易于学习,占用空间小,性能却快如闪电,可以快速、 高效的管理从小到大的项目…

IP扫描工具

什么是高级 IP 扫描仪 高级 IP 扫描程序是网络中必不可少的工具,使管理员能够跟踪网络地址空间。在提供要扫描的 IP 地址范围时,高级 IP 扫描程序会借助网络扫描协议按顺序检查该范围内的每个 IP,扫描后,高级 IP 扫描程序工具可查…

Python 使用 Stable Diffusion API 生成图片示例

代码: import base64 import datetime import json import osimport requestsdef submit_post(url: str, data: dict):"""Submit a POST request to the given URL with the given data.:param url: url:param data: data:return: response"…

Unity 之 安卓平台上架隐私问题解决方案

Unity 之 助力游戏增长 -- 解决隐私问题 一,平台测试隐私问题二,解决方式一2.1 勾选自定义Mainifest2.2 修改自定义Mainifest2.3 隐私协议弹窗逻辑 三,解决方式二3.1 导出安卓工程3.2 创建上层Activity3.3 配置AndroidManifest 四&#xff0…

通过new FormData提交简单数据

通过new FormData提交简单数据 效果示例图代码 效果示例图 代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style type"text/css">* {padding: 0px;margin: 0px;box-sizing: border-…

Maven学习及分模块创建

一、引言 1.1 项目管理问题 写项目时&#xff0c;我们需要引用各种 jar 包&#xff0c;尤其是比较大的工程&#xff0c;引用的 jar 包往往有几十个乃至上百个&#xff0c; 每用 到一种 jar 包&#xff0c;都需要手动引入工程目录&#xff0c;而且经常遇到各种让人抓狂的 jar 包…

IEC 103/104

IEC101 串口通信 串口远动协议 控制区和数据区&#xff0c;(信息体地址&#xff0c;装置地址等) IEC102 电量采集 IEC103 保护设备的通信 串口 实时监测 各种故障 103协议就是用来保护装置和后台监控进行通信的。 IEC104 调度自动化系统、厂站之间的通讯 网络 帧里面多了…