MATLAB实现自动水表读数

MATLAB实现自动水表读数

1、 本文中的人工智能应用实例介绍
现在水表生产企业所生产的水表,出厂前都需要对其进行检定,只有达到了要求的检测精度才可以进入市场。当前应用的水表校验系统,大多采用人工操作的方法,需要人工进行抄读测量结果并进行水表误差的计算,这种人工校验方法,不仅检定效率低,工作强度大,而且检定结果极易受人为因素的影响[1]。为了克服人工抄表校验过程中所带来的各种弊端,本文设计了一款基于图像处理技术的多指针水表自动校验系统,来代替人工完成对水表数据的读取和处理工作,进而完成对水表的校验,不仅可以节约大量的劳动力还可以提高生产效率,减小人为因素所造成的影响。
2、 所用的AI方法原理或方案设计
图片处理流程如下图所示:
在这里插入图片描述

(1) 提取指针
由水表图片可发现,水表指针颜色与其他部分颜色区别差异较大,因此选择了通过RGB三个分量来进行处理,将一定范围外的像素置为白色,使得最后剩下来的非白色的部分即为指针。本文中保留R(120-220),G(10-70),B(10-70)的区域,其余设置为255。
原图RGB提取后图片

在通过RGB提取后的图片,我们可以清楚的看到图片中只剩下了各个指针不为白色,这将是我们作为后续处理的基础。
(2) 变为二值图像
由于RGB的彩色图像表示复杂,许多操作难以进行,因为选择了只有0和1来表示颜色的二值图像,其中0表示黑色,1表示白色。使用的函数为im2bw。
A=im2bw(B) %B为要转换的RGB真彩色图像,A为所得的二值图像。结果如图:在这里插入图片描述

结果如图所示,红色指针变为黑色。
(3) 腐蚀
从上图中不难发现,进行了RGB提取与二值化后,虽然图片被直接分为了黑色和白色,但由于拍摄原因,黑白颜色会容易夹杂在一起,因此需要进行腐蚀操作让指针变得圆滑。使用的函数为imerode函数。
IM2 = imerode(IM,SE)
腐蚀灰度、二进制或压缩二进制图像 IM ,返回腐蚀图像 IM2 。参数 SE 是函数 strel 返回的一个结构元素体或是结构元素体阵列。如果 IM 是逻辑图像,结构元素是平坦的, imerode 执行二进制膨胀;否则执行灰度腐蚀。如果SE 是一个结构元素体阵列, imerode 接连使用 SE 中的每个结构元素体对输入图像进行多重腐蚀。
结果如图:在这里插入图片描述

经过腐蚀操作后,可以看到在保留了指针的基本结构下,指针中的白 色斑点被去除了,各个指针真正实现了完全提取。
(4) 霍夫变换
完全提取出指针后,便做好了前期的处理工作,接下来进行核心的处理,进行霍夫变换。这里先介绍霍夫变换:
Hough变换的方法基本思想可以从检测图像中的直线这个简单问题中看到。直线由两点A=(X1,Y1)和B=(X2,Y2)定义,所下图1(a)示。通过点A的所有直线由y1=kx1+q表示,k和q是某些值。这意味着同一个方程可以解释为参数空间k,q的方程。因此通过点A的所须直线可以表示为方程q=-x1k+y1图1.(b)。类似地通过点B的直线可以表示q=-x2*k+y2。在参数空间k和q中,两条直线的唯一公共点是在原图像空间中表示连接点A和B的唯一存在的直线。
在这里插入图片描述

这意味着图像中的每条直线在参数空k,q中由单独一个点表示,直线的任何一部分都变换为同一个点。直线检测的主要思想是确定图中所在的直线像素,将通过这些像素的所在直线变换到参数空间的对应点,在参数空间检测点(a,b),此点是图像中出现的直线y=ax+b的Hough变换的结果。
图像中所有可能的直线像素的检测,可以通过在图像中进行边缘检测子得到,所有边缘幅值超过某个阈值的像素都可以看作是可能的直线像素。在最一般的情况下,当我们没有任何有关图像中的直线信息,因此,所有方向的直线可能通过任何边缘像素。而在现在实现中,这些直线的数目是无限的,然而,为了实际目标,只能有限数目的直线方向。直线的可能方向定义了参数K的一个离散化,因此参数q也被采样为有限数目的值。所以参数空间不是连续的,而是被表示为矩形单元,称之为累计数组(accumulator array) A,它的元素是累计单元(Accumulator cells) A(k,q). 对于每个边缘元素,确定其参数k和q。这些参数表示了通过此像素的允许方向的直线。对于每条这样的直线,直线参数k和q的值用来增加累计单元A(k,q)的值。如果公式y=ax+b所表示的直线出现在图像中,A(a,b)的值会被增加很多次,而次数等于直线y=ax+b作为可能通过某个边缘像素的直线被检测到的数目。
对于任意像素P,通过它的直线可能是任何的方向k,但是第二个参数q受像素P图像坐标和方向k所约束。因此,存在于图像中的直线会引起图像中适合的累计单元值变大,而通近边缘像素的其他直线,它们不对应于图像中存在的直线,对于每个边缘像素具有不同的参数k和q,所以对应的累计单元极少被增加。即:图像中存在的直线可以作为累计数组中的高值累计单元被检测出业,检测到的直线参数由累计数组的坐标给出,结果是图像中直线的检测被为累计空间中的局部极值的检测。[2]
这里介绍霍夫变换应用的三个函数:

  1. [H, theta, rho] = hough (f);%f为输入的二值图像,H为输出矩阵,theta为角度,rho为长度。[2]
  2. [r,c]= houghpeaks (H,5);%r,c为输出矩阵,H为函数一的输出矩阵,5为寻找的峰值的个数。该函数功能是找到峰值,峰值个数可由自己确定。[3]
  3. lines = houghlines (f, theta,rho, r,c)%f为输入二值图像,r,c为函数二的输出矩阵。该函数功能是查找并链接带峰值位置并重叠的Hough变换。[3]
    在这里插入图片描述在这里插入图片描述

从上右图中可看到三个指针都实现了正确标记。各个点位都被记录在了变量lines中,包括直线的长度与角度。
(5) 在步骤四中已经将得到的三个角度记录在了变量lines中,此时即可通过角度与该指针所在的刻度进行运算得出最后总的水表指数。
3、 结果分析与讨论
最后通过霍夫变换,三个函数得出了三个指针的角度,从而计算出了指针的读数,但若应用于实际生产中会有许多的问题。如第一步通过rgb分量提取指针,这一步骤事实上充满了不确定性,会被许多因素干扰,如拍摄时的角度,光线,以及水表表面有污渍会严重影响提取出的指针的质量。以及最后的角度顺序与水表指针的配对问题,这一问题我更倾向于通过图像分割来处理。
以下为MATLAB下的代码:

clc;
close all;
clear all;
I=imread('clo5.png');
figure(4),imshow(I)
lot_1=I;
lot_R=I(:,:,1);
lot_G=I(:,:,2);
lot_B=I(:,:,3);
lot_R1=lot_R;
lot_G1=lot_G;
lot_B1=lot_B;
lot_R1((lot_R<=120)|(lot_R>=220)|(lot_G>=70)|(lot_G<=10)|(lot_B>70)|(lot_B<=10))=255;%提取指针
lot_G1(lot_R<=120|lot_R>=220|lot_G>=70|lot_G<=10|lot_B>70|lot_B<=10)=255;
lot_B1(lot_R<=120|lot_R>=220|lot_G>=70|lot_G<=10|lot_B>70|lot_B<=10)=255;
lot_1(:,:,1)=lot_R1;
lot_1(:,:,2)=lot_G1;
lot_1(:,:,3)=lot_B1;
figure(1),imshow(lot_1);
BW = im2bw(lot_1,graythresh(I));   %二值化图像
figure(2),imshow(BW)
se=strel('disk',5); 
BW=imerode(BW,se);   %腐蚀
figure(3),imshow(BW)
BW=~BW   %取反
[H, theta, rho]= hough(BW,'RhoResolution',0.5);      %霍夫变换
peak=houghpeaks(H,3,'threshold',ceil(0.3*max(H(:))));    %寻找峰值
hold on      
lines=houghlines(BW,theta,rho,peak,'FillGap',5,'MinLength',7);    %寻找直线的起始点
figure,imshow(BW,[]),title('Hough Transform Detect Result'),hold on    
for k=1:length(lines)    %标出直线
    	xy=[lines(k).point1;lines(k).point2];    
   		plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','red');
end

参考文献:
[1]乔丽娟. 基于图像处理技术的多指针水表自动校验系统[博士(硕士)学位论文][D]知网
[2]Hough Transform:http://en.wikipedia.org/wiki/Hough_transform
[3].冈萨雷斯.数字图像处理(MATLAB版)[C].北京:电子工业出版社, 2005: 296-301

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值