摘要
随着模式识别技术、计算机技术等多种技术的不断完善和发展,机器视觉获得了巨大的进步与发展。目前在许多企业中,存在着大量的仪表,仪表的读数都要靠人来完成,工作量很大而且误差率相对来说比较高,基于这个原因,设计了一个工业生产线在线检测数据数字化处理系统。首先通过摄像头采集仪表图像,通过传输装置以无线的方式把图像传输到电脑上,然后在电脑上通过matlab程序设计,处理图像,读取仪表的数据,然后用labview调用matlab程序,并设计一个显示界面,通过界面可以看到实时的数据与仪表图像以及在一段时间内数据的变化情况。最后通过labview访问access数据库,将读取的数据传入数据库中,便于被调用,最终实现检测数据的数字化处理。
关键词:机器视觉 图像处理 Matlab Labview
Online testing data of industrial production line digital processing system design
Abstract
With the development of computer technology and pattern recognition technology,machine vision technology makes a great progress and develop-
ment.At present,there are a lot of instrument in many enterprises.in-
strument reading work need people to complete.So there are a lot of work
to do and efficiency is very low,as the same time,error rate is quite
high.For this reason,there design a online testing data of industrial production line digital processing system.First of all,there need to take
Picture by camera.next,through transmission device in wireless way to transmit the image to a computer. Then by matlab programming on the compu-
ter,data processing images, read the meter.And then call matlab by labview and design a display interface.Through the interface can see the real-time data.At last,through labview access access database,and take the data into database.Finally,realize the testing data of the digital processing.
Keywords: Machine vision image processing Matlab Labview
目 录
近年来,随着科学技术的进步,许多新兴的技术不断的产生与发展,机器视觉技术也随着图像处理等技术的发展而逐渐产生,而且发展很快。近些年来,世界范围内涌现了许多的专门从事机器视觉技术的公司,有许多的公司得到了很好的利润。现阶段,国内的机器视觉技术虽然刚起步不长的时间,但是,也有几家公司在这方面取得了不错的成绩,并且发展的速度也很快。所谓的机器视觉是以通过处理图像达到类似于人眼的视觉的效果,提高工作效率减轻人的工作负担,为最终目的。相比于人类的视觉,首先机器视觉不会出现疲劳现象,而且机器视觉识别的精度可以比人眼的识别的精度还要高一些。目前,很多领域中都出现了机器视觉技术的影子,这也体现出了机器视觉技术的研究价值。主要应用的领域有:医学领域、工业检测领域、监控管理、航天领域等。当机器视觉技术应用于工业检测领域时,可以实现工业生产线在线检测数据的自动读取,提高读数的准确性,有效减轻人的负担,及时准确的发现问题、解决问题。
进入21世纪后,电子类的仪表应用的越来越多,准确度更高的数字式仪表大有取代传统的指针式仪表的趋势。但是,数字式的仪表在某些情况下不能使用,对环境的适应性比较差,比如,在读数快速变化的时候就不适合使用了,而且,相比于指针式仪表来说,数字仪表价格相对较高,大批量的购买成本会上升很多。指针式仪表则可以适用于很多的场合,环境因素对其约束相对来说不大。除此之外,指针式仪表还有许多其他的优点,比如,抗干扰性强,防尘,防水等,因此我们国家的许多行业中,尤其是那些严禁易燃易爆的场合,比如电力、石油、化工等,指针式仪表仍然是首选,在环境恶劣的场合,根本无法使用数字式的仪表。在一般的工厂中,指针式的仪表数量大、种类多,这些仪表的读数十分的麻烦,而且工作量很大,工作效率很低。传统上人们是检定指针式仪表的方法是人工判读,但是这种判别方法会受到许多人为因素的干扰,比如人的观测仪表角度、疲劳强度以及观测的距离,具有工作强度大,误差率大等缺点,不能实现仪表读数与检测的自动化。每个仪表都需要依靠人来瞄准,每个仪表的操作也需要依靠人来完成,这种方式的工作量大,效率低。
为了缩短检测的时间,有效减轻工作人员工作强度 ,提高检测工作的自动化水平,设计工业生产线在线检测数据数字化处理系统是很有必要的。利用机器视觉技术,可以实现仪表图像的采集、识别以及仪表数据的读取,而整个设计的关键就在于如何用图像识别的方式识别仪表,读取数据。
工业生产线在线监测数据的数字化处理系统的设计的核心是使用图像识别的方法识别仪表,指针式仪表的读数识别研究起步相对来说较晚,1994年,sablatnig等人提出了利用hough变换来检测指针式仪表的读数的方法[1]。1995 年,韩国的 Kyong-Ho Kim 等人成功的实现了对核装置数字表的图像分割,采用的方法是区域划分和阈值法,最终采取一系列的措施,建立一个完全自动化仪表识别系统[2]。Correa Alegria等人完成了利用机器视觉技术对指针式仪表的检定,整个过程为,首先使用摄像头采集图像,然后采用减影法处理图像,保存图像,然后利用霍夫变换检测直线,识别指针,并且读出指针的角度然,最后,根据指针角度通过计算,得到指针的读数[3]。孙凤杰等人提出一种新的提取指针的方法,这种新方法适合较差光照条件下使用,从而解决了光照条件对指针分割的约束问题,取得了较好的识别效果[4]。黎明和王厚枢设计了一个飞机座舱仪表读数的识别系统,这个系统首先进行图像二值化,主要运用的小波变换来提取指针及刻度,并且成功的去除了光线以及各种外部噪声对整个读数系统的影响,检测出指针和刻度后,找到仪表圆心,测量出指针的角度,找到指针角度与读数的关系,并成功读取数据,这个系统的识别精度很高,完全高于人眼的识别,而且成功实现了在线测试[5]。周洪和钟明慧成功的实现了指针式的仪表的数据的自动读取。这种读数方法突破了距离的限制,可以远距离的通过读取到仪表的读书,而且读数准确,延迟也很小,可以在线测试,整个系统的安装也很简单,而且成本也很低,对于一些危险场合的仪表读数具有重要的现实意义[6]。2007年,杨晓敏等人设计了一种新的识别方法,这种方法的原理与车牌识别的远离非常相似模,是一种高斯混合模型识别方法[7]。何智杰等人设计了一种新的仪表读数的识别方法,这种新方法特别适合精度很高的指针仪表,这个方法中主要运用了霍夫变换和中心投影分析法,这种方法可以实现刻度的全自动识别,而且还提高了识别的精度和速度[8]。宁志刚等提出一种可应用于高精度指针仪表读数的方法,该方法的原理是利用脊波来提取仪表图像中的直线,可实现自动跟踪判读[9]。
对于大多数的指针式仪表,尤其是准确度比较高的仪表的检验,仍然需要通过人来实现,这其中夹杂了许多的人为因素,不同的人对于同一个仪表可能会读出不同的数据,对于准确度比较高的仪表,会有比较大的误差率,而且人会出现视觉疲劳,增加了数值被读错的可能性,造成人为的误差。所以,设计一种能自动读取指针式仪表读数的系统,就可以大大减少人的工作量 ,降低工作的强度,提高读数的准确性,提高工作效率。工业设备能耗参数指标体系建立后,通过计算机就可以清楚的了解到各设备的能耗情况以及工作状态及时准确的发现问题,这样可以减少能源的消耗,优化能源结构,提高能源利用率,提高生产效率,具有良好的经济效益和社会效益。
①对组成工业生产线在线检测数据数字化处理系统的各种软硬件进行综合设计,硬件部分包括摄像头、图像传输设备、图像接受设备的选择;软件部分包括对接收到的图像进行处理的相关程序,读数显示界面的相关程序。
②研究准确读取仪表数据的方法:获得较高质量表盘图像,有效的把指针检测出来,提高读数的准确性。
③.数据显示界面的设计:能够看到此时此刻的仪表图像以及对应的表盘读数,能够看出仪表的读数在一段时间内的变化情况。
工业生产线在线检测数据数字化处理系统主要由图像采集装置、图像发射与接受装置、图像处理部分以及客户端等部分组成。设计方案如下所示:
图像发射与接收装置采用的是无线影音发射器,图像处理部分是由matlab来完成的,而客户端则是由labview来设计的。
通过摄像头可以采集到清晰的图像,无线影音传输器可实现图像的远距离传输,用matlab程序可以处理图像,读取数据,labview是一种程序开发环境,可以实现显示界面的搭建,所以,该方案可行。
表盘图像的采集选择的是探头摄像头,该摄像头的参数如下图所示,该摄像头拥有六颗直径5mm的红外灯,可以实现夜拍的功能,视频线选择铜芯铜网的全铜视频线,保证传输图像不受干扰。
图3-1 摄像头参数
图像传输选取的是无线影音传输器,无线影音传输器是一种可以把图像和声音无线传输到电脑上的无线设备,该装置如下图所示。
图3-2 无线影音传输器
无线影音传输器共有六个部分:发射机、接受机、全向天线、音视频线、12V2A电源以及12V1A电源。表3-1是发射机的技术参数,表3-2为接收机的参数。
无线影音传输器的特点如下:
①具有微波抗干扰功能比较好;
②传输和接受的品质好,接收到的图像清晰稳定;
③多种频率定制,适应不同的电磁环境;
④可以在同一地方使用八套,信号不会相互干扰
⑤可以传送的信号包括DVD、VCD、CD、电视、录像等等;
⑥具有广泛的应用范围;
⑦传输距离远;
⑧经济实惠;
⑨维护简单方便,可配合移动电源供电。
该传输器的安装方法为:
①把发射器(2A)和电源适配器连接起来将,然后通电,如果红灯亮了,则说明发射器通电成功。
②将另一电源适配器接于接收器输入端(1A),接上电源,红灯亮,则证明接收机通电成功。
③把摄像头和发射器用音/视频线连接起来,接收器连在显示器上,把发射器和接收器的频道选择开关调到同一位置,通过显示器可以看到摄像头传来的画
面,完成安装。
图3-3 传输器安装示意图
视频采集卡选用的是4路USB视频采集卡,如下图所示,该视频采集卡具有以下功能:
①该采集卡带有4路视频,4路音频,录像D1,回放D1;
②支持电脑操作系统,XP系统,Win7系统;
③支持网络远程监控,自带动态域名,设置简单;
④可以支持多种录像模式,如手动录像,定时录像等;
⑤每路可单独设置工作时间表,支持可编程定时录像,循环录像;
⑥支持画面捕捉、画面保存以及画面备份功能;
⑦支持远程回放功能。
图3-4 视频采集卡
图像采集与传输系统的设计有两种方案,如下图所示。
方案一:摄像头+电源+支架+BNC接头+无线接收器+USB采集卡+电脑+显示器
方案二:摄像头+电源+支架+BNG接头+无线接收器+USB采集卡+硬盘录像机+硬盘+显示器
在电脑上操作更加灵活方便,而且图像处理也是在电脑上进行的,所以,选择方案一。
图3-5 传输系统设计示意图
经过在工厂的实地测试,该图像采集与传输系统可以实现无线传输的功能,并且具有一定的抗干扰性,下图所示的图片是在工厂中距离仪表大约100米远的楼上所接收到的图片。
图3-6 工厂实地测试接收画面
在图像采集的过程中,会受到许多的干扰,包括自身的和外界的,例如,外界光照条件的影响,摄像头像素的高低,仪表表盘的清洁程度以及各种振动及噪声的干扰。受到诸多的干扰后得到的照片可能会是模糊的,可能无法获取我们需要的信息,要想得到有用的信息就必须想办法去掉这些干扰。我们通过摄像头的到的图像都是彩色的,里面蕴含了大量的信息,处理起来相当繁琐,而且计算也非常复杂,容易出现错误,所以为了处理简单,必须要把彩色图片转化为蕴含信息比较少的灰度图片。这些都是要通过图像预处理来实现,图像预处理的目的是去除图像上的噪声,减少图像的信息,简化运算,为图像处理打好基础。图像预处理包括:图像滤波去噪,图像增强,图像二值化,边缘检测与图像检测。
图像在采集、获取和传输的过程中,几乎所有的图像都会收到不同程度的噪声污染,这些噪声有的是可见的,有的是不可见的,有的噪声污染在图像上体现的很明显,有的则是难以察觉的。对于不同的地点,信噪比是不同的,信噪比越大,图像的质量则越好,但当信噪比低于一定的数值时,噪声将会变成人眼可见的颗粒状,图片就会变得模糊起来,图片质量也会相应的下降。更重要的是,噪声所产生的颗粒有可能会掩盖我们需要的信息细节,由于在工厂中采集图像的过程中,噪声污染是不可避免的,而且噪声污染体现在视觉上也是比较明显的,所以必须要对图像进行滤波去噪的处理,因为摄像头所采集到的照片是彩色的,数据量很大,计算复杂,处理起来容易出错,而颜色信息对于最终的读数是没有影响的,所以,为了简化运算,使图像的处理变得先对简单,在滤波去噪之前,先要对图像进行灰度化处理,然后再进行滤波,在本设计中采用的是中值滤波,中值滤波[10]起初是用于一维信号的处理,后来很快被应用到二维图像的处理之中。所谓的中值滤波,简单地说,就是所有的像素按照数值大小排列起来,然后取中间值作为整个图像的灰度值。
中值滤波是在很多地方都可以被用到,相对来说,原理也比较简单,是一种非线性的滤波,它采用的是一个包含奇数个点的滑动窗门,最终整个窗口的灰度值是窗口中的灰度值的中间值。它的原理如下,对于一个一维的序列
选取的滑动窗口的长度为m,对这个一维的序列进行中值滤波,从输入的一维序列之中按照顺序取出m个元素,
,其中,i代表滑动窗口的中心位置,
=
,将这m个数按数值由大到小排列起来,找出中间的数作为滤波的输出数值,数学表达式为:
(3-1) 上式中,
表示的是取序列的中值。例如,有这么一个一维的序列{11,20,16,24,29},次序列由小到大排列的结果为{11,16,20,24,29},那么,中值滤波输出的结果为20。假如灰度值是29的像素是被噪声污染的像素,那么,经过中值滤波后被噪声污染的像素将被过除掉。按照这个原理,中值滤波同样可以适用于二维的序列,在对二维序列
对比上面的的几个公式可以看出,而均值滤波的输出和输入的分布是没有关系的,而中值滤波的输出的输入噪声的密度分布是相关的。中值滤波与均值滤波各有特点,均值滤波对于随机噪声的抑制能力更强,而中值滤波则更适用于脉冲干扰。图3-7为加入盐噪声的图片和进行中值滤波 处理之后的图片,可以看出,中值滤波的效果还是很明显的。中值滤波的主要程序为:
J= imread('1.jpg');
K = imnoise(J,'salt & pepper',0.02);
imshow(J);figure;imshow(K);
L =medfilt2(rgb2gray(K));
imshow(K), figure, imshow(L);
图3-7 加入盐噪声的图片与滤波后的图片
图像增强是以改善图像的视觉效果为根本目的的,在采集图像的过程中,特别是在工厂中,光照条件对图片质量的影响十分明显,而拍摄的过程中可能会出现曝光过度或者曝光不足的现象,这样得到的图像将会是模糊的,表盘上的指针刻度区域与背景区域的区分不是很明显,不利于仪表图像的识别。为了使表盘上指针刻度区域与背景区域的界限变得明显,需要对图像进行空间域的图像增强。空间域的的图像增强主要有两种方式,直方图的均衡化处理和灰度变换,本设计中采用的是灰度变换。灰度变换的变换函数有三种,包括线性变换、非线性变换以及分段线性变换,,三种变换函数各有特点,应根据图像的特点已经应用的场合选择相应的函数。本设计中采用的是分段线性变换法进行图像灰度的对比度增强。分段线性变换函数中最常被用到的是三段线性变换,其数学表达式如下:
j=imread('1.jpg');
x=RGB2gray(j);
subplot(1,2,1);
imshow(x);
title('原图像');
f=double(x);
[m,n]=size(f);
h=fspecial('gaussian',[25,25],80);
q=imfilter(f,h,'same');
s=log(f+0.03)-log(q+0.03);
r=exp(s);
max_r=max(r(:))*0.27;
min_r=min(r(:));
r=(r-min_r)/(max_r-min_r);
index=find(r>1);
r(index)=1;
R=mat2gray(r);
subplot(1,2,2);
imshow(R);
title('处理后的图像');
G=im2bw(R,0.7);
imshow(G);
I=uint8(G);
bw=edge(I,'sobel');
imshow(bw);
图3-8 增强后的图片
进行完图像增强后的图像是灰度图像,灰度图像的每个像素都可以在0-255之间取值,每个像素都可以有如此多的取值,这样的图像计算和处理起来十分的麻烦,而且容易出错,所以,就要对图像进行二值化处理,使图像的每个像素只能去0与1两个值,“0”作为目标区域,“1”作为背景区域,反之,亦可以,这样计算将变得相对简单,也不容易出错。用来划分背景区域和目标区域的那个灰度值就称作为阈值,大于阈值的像素值全部设为1,小于阈值的则全部设为0.图像的二值化[11]处理是图像处理中最常用的技术,在图像处理中具有至关重要的地位。主要有三个原因,首先,在彩色图像或者灰度图像的处理过程中,都要先将图像进行二值化处理,然后再进行更深层次的计算。其次,在理论上和方法上图像二值化比灰度图像处理更加系统化,也更加稳定。 第三,当图像处理的对象是文字或者图纸的时候,从本质上来说,背景和图形也是一种二值化的图像。在图像二值化的原理如(3-6)所示
T=0.5*(double(min(I(:)))+double(max(I(:))));
done=false;
while ~done
g=I>=T;
Tnext=0.5*(mean(I(g))+mean(I(~g)));
done=abs(T-Tnext)<0.5;
T=Tnext;
end
J=I;
K=find(J>=T);
J(K)=255;
K=find(J<T);
J(K)=0;
figure;
图3-9 二值化图片
对于图像处理来说,边缘检测是必须的。因为从边缘的定义上就可以看出,边缘是图像的重要的基本特征。边缘蕴含着图像的方向、阶跃性质与形状重要的信息,而这些信息十分的重要,它可以应用在在图像分割、特征提取、图像分类、图像配准以及图像识别中。图像边缘可以分为两大类,一类是阶跃状边缘,另一类是屋顶状边缘,其中两边灰度值有明显的变化的是阶跃状边缘;而在灰度减小和增加的交界处的是屋顶状边缘。首先通过利用边缘增强算子,来突出图像中局边缘,然后再定义像素的“边缘强度”,最后通过设置阈值来提取边缘点集是边缘检测的基本的思想。边缘检测方法有Sobel算子法[12]、 Robert算子法[13]、 PreWltt算子法[14]、LOG算子法、Canny算子法、Zerocross算子法[15]以及二值图像边缘检测法等。这些算法各有特点,适用的条件也不一样。本设计中采用的是Sobel算子法。
图像分割是对图像进行处理、分析的一项基本内容,通过图像分割可以分割出所需要的部分进行分析。图像分割是从图像处理到读数识别的一个转折点,只有分割出图像后才能进行真正意义上的图像分析与图像计算。因此,对于图像分析来说是非常重要的。目前已经有很多的图像分割算法,如门限法、区域生长法、匹配法、分裂-合并法、水线法、边缘检测法、马尔可夫随机场模型法、小波分析法、多尺度法、数学形态法等。这些算法都是针对于一类图像,没有哪一种算法能够适用于所有的图像,但是可以利用这些算法的原理以及算法中的一些思想处理一些其他的图像分割问题,由于在前面已经完成了边缘检测,所以在本设计中采用了基于边缘检测的图像分割。图3-10为边缘检测的结果
图3-10 边缘检测
指针的识别可以说是识别读数最为重要的环节,仪表的读数都是有指针决定的,指针在采集图像的过程中会连续的变换指向,在摄像头与表盘无相对运动的情况下,摄像头采集到的指针位置不同的两幅图像,指针也可以看作一条直线,而且比其他刻度线都要长很多,所以可以采用霍夫变换来检测指针,以及识别其他的刻度。
霍夫变换在图像处理中一种应用很广泛的识别几何形状的方法,以霍夫变换额、为原理,衍生出许多其他的算法,但是从黑白图像中检测直线或者线段是最基本的霍夫变换。本设计中指针检测的主要思路为,首先通过霍夫检测检测出所有的直线,包括所有的刻度和指针,而指针则是所有直线中最长的,所以,接下来设计程序求这些所检测出的直线中的最长的线,然后对直线的起始位置进行标记,并对直线进行标记。
图3-11为利用霍夫变换检测直线,图3-12为检测出的指针图像,指针检测的主要程序为:
xlabel('\theta'), ylabel('\rho');
axis on, axis normal, hold on;
P = houghpeaks(H,1,'threshold',ceil(0.3*max(H(:))));
x = T(P(:,2));
y = R(P(:,1));
plot(x,y,'s','color','white');
lines = houghlines(BW,T,R,P,'FillGap',5,'MinLength',7);
hold on;
figure, imshow(RGB), hold on
max_len = 0;
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow'); plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
len = norm(lines(k).point1 - lines(k).point2);
if ( len > max_len)
max_len = len;
xy_long = xy;
end
end
仪表表盘的读数识别是整个读数系统中最为重要的的部分,目前读数识别的方法多种多样,经过在工厂的实地考察,发现该工厂的有些材料生产车间环境相对较差,表盘难以时刻保持清洁,总是沾带有大量的粉尘,通过距离法读取表盘的读数相对来说比较困难,也不够稳定,而选取通过指针角度来读取表盘数据则可以更好的适应环境,提高读数的稳定性。读数识别的主要程序如下:
plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','cyan');
k=(xy(2,2)-xy(1,2))/(xy(2,1)-xy(1,1));
theta=pi/2+atan(k);
if((xy(1,1)+xy(2,1))/2<=N/2)
q=(theta+pi)*180/3.14;
else
q=theta*180/3.14;
end
shishu=q*c/Q;
disp (theta);
disp (q);
disp (shishu);
3.3数据显示界面的设计
表盘数据读取出来后,需要直观的显示出来,这时就需要搭建一个显示界面,如今,有多种软件可实现见面搭建的功能,本设计中选择的是labview图形化编程软件,labview有前面板与程序框图面板构成。
数据显示界面的前面板也就是我们直接看到的数据显示界面,它包括数据显示、图像显示、图像路径、数据变化曲线图以及一些基本的参数设置部分,如下图所示。
图3-13 前面板
该界面中,可以通过鼠标或者键盘输入仪表的最大值和最小值,从而提高了整个设计的适应性,通过图像显示控件可以看到实时的图像,图像下面与之对应的是数据显示,数据显示与图像显示同步进行,可以及时的发现纠正错误,完善系统,图像显示右边为数据变化曲线图,可以了解到数据在最近一段时间内的变化情况,时间范围可根据需要自行设置,界面的左下角为路径选择,由于整个系统在不停的运转,为了防止路径选择对话框不断的弹出,必须设置一个默认路径,让系统自行选取,设置方法如下图所示。
3-14 默认路径设置
前面板的控件选择好之后,就要在程序框图面板中选择相应的函数以及对各部分之间进行连线以实现相应的功能,程序框图面板如下图所示。
3-15 程序框图面板
图片显示是通过vision控件来实现的,通过matlab脚本节点调用matlab程序,实现图像处理功能,通过在脚本框上添加输出与输入来实现matlab程序的数据输入与输出,要注意的是,脚本框上的数据输入与输出的变量名必须与matlab程序中需要输入或输出的变量名保持一致,设计完这些之后,再用一个while循环来实现系统的连续运行。
3.4数据库的建立
读取出来的数据要传入数据库中,方便下一级的调用,所以,必须要实现用labview对数据库进行访问,本设计中选择的是access数据库,使用labSQL来实现labview对access数据库的访问。
使用LabSQL之前,需要建一个Access数据源。数据源是ODBC到数据库的接口形式,它描述了用户需要访问的数据库及其各类参数,而数据源通过数据源名DSN ( Data Source Name)来标识。打开控制面板,管理上具,数据源管理器,通过选择数据源驱动、配置数据源参数等操作可完成Access数据源的建立。主要操作界面如图3-16和图3-17所示。 图3-17创建access数据源
Access数据源建立以后,通过labview程序设计即可实现labview对数据库的访问。Labview程序框图如下所示。
图3-18数据库访问程序框图
①经过在工厂的实地测试,图像采集与传输装置可以正常工作,电脑端可以接收到清晰的图像,并且整个系统具有一定的的抗干扰的能力,在嘈杂的环境中亦可以实现其功能。
②通过matlab可实现图片的预处理以及指针识别读数识别,读取的数据相对准确
③通过labview可以成功的调用matlab函数,并实现函数的功能,通过labview搭建的界面,可以观测到实时的仪表读数以及仪表图像,可以观测到仪表读数在一段时间内的变化情况,并且可以实现连续的运行。
④整个系统的稳定性较高,可以实现持续的工作,对所处理的仪表图像的适应性较强。
在本次毕业设计中,我学习了matlab,labview程序设计以及access的相关知识,学习了图像处理的相关方法,学会了更多解决问题、处理问题的方法,增强了处理问题的能力,为今后的发展奠定了良好的基础。
clear;
clc;
close all;
RGB=imread('1.jpg');
figure,imshow(RGB); title('RGB')
GRAY=rgb2gray(RGB);
figure,imshow(GRAY); title('GRAY')
threshold=graythresh(GRAY);
BW=im2bw(GRAY,threshold);
figure,imshow(BW); title('BW')
BW=~BW;
figure,imshow(BW); title('~BW')
BW=bwmorph(BW,'thin',Inf);
figure,imshow(BW); title('BWMORPH')
[M,N]=size(BW);
[H,T,R] = hough(BW);
figure;
plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','cyan');
k=(xy(2,2)-xy(1,2))/(xy(2,1)-xy(1,1));
theta=pi/2+atan(k);
if((xy(1,1)+xy(2,1))/2<=N/2)
q=(theta+pi)*180/3.14;
else
q=theta*180/3.14;
end
shishu=q*6/2700-0.2;
disp (theta);
disp (q);
disp (shishu);
j=imread('1.jpg');
x=RGB2gray(j);
subplot(1,2,1);
imshow(x);
title('原图像');
f=double(x);
[m,n]=size(f);
h=fspecial('gaussian',[25,25],80);%创建高斯模板
q=imfilter(f,h,'same');
s=log(f+0.03)-log(q+0.03);
r=exp(s);
%归一化处理
max_r=max(r(:))*0.27;
min_r=min(r(:));
r=(r-min_r)/(max_r-min_r);
index=find(r>1);
r(index)=1;
R=mat2gray(r);
subplot(1,2,2);
imshow(R);
title('处理后的图像');
G=im2bw(R,0.7);
imshow(G);
I=uint8(G);
bw=edge(I,'sobel');
imshow(bw);
A=imread('1.jpg');
I=rgb2gray(A);
T=0.5*(double(min(I(:)))+double(max(I(:))));
done=false;
while ~done
g=I>=T;
Tnext=0.5*(mean(I(g))+mean(I(~g)));
done=abs(T-Tnext)<0.5;
T=Tnext;
end
J=I;
K=find(J>=T);
J(K)=255;
K=find(J<T);
J(K)=0;
figure;
subplot(1,2,1),imshow(I,[]),title('原始图像');
subplot(1,2,2),imshow(J,[]),title('分割后图像');
t1=clock;
I=imread('1.jpg');
subplot(1,2,1);
J=rgb2gray(I);
title('pso算法图像分割的结果');
[a,b]=size(J);
[p,x]=imhist(J,256);
L=x';
LP=p'/(a*b);
n=256;
c1=2;
c2=2;
wmax=0.9;
wmin=0.4;
G=10;
M=15;
X=min(L)+fix((max(L)-min(L))*rand(1,M));
V=min(L)+(max(L)-min(L))*rand(1,M);
m=0;
for i=1:1:n
m=m+L(i)*LP(i);
endpbest=zeros(M,2);
gbest1=0;
gbest2=0;
GG=0;
t2=clock;
for k=1:1:G
w(k)=wmax-(wmax-wmin)*k/G;
for i=1:1:M
t=length(find(X(i)>=L));
r=0;
s=0;
for j=1:1:t
r=r+LP(j);
s=s+L(j)*LP(j);
end
W0(i)=r;
W1(i)=1-r;
U0(i)=s/r;
U1(i)=(m-s)/(1-r);
end
for i0=1:1:M
BB(i0)=W0(i0)*W1(i0)*((U1(i0)-U0(i0))^2);
end
for i=1:1:M
if pbest(i,2)<BB(i)
pbest(i,2)=BB(i);
pbest(i,1)=X(i);
end
end
[MAX,CC]=max(BB);
if MAX>=gbest2
gbest2=MAX;
gbest1=X(CC);
end
GG(k)=gbest2;
for i=1:1:M
V(i)=round(w(k)*V(i)+c1*rand*(pbest(i,1)-X(i))+c2*rand*(gbest1-X(i)));
X(i)=V(i)+X(i);
end
end
for i=1:1:a
for j=1:1:b
if J(i,j)>gbest1
J(i,j)=250;
else
J(i,j)=0;
end
end
end
kk=1:1:G;
gbest1;
figure(1);
imshow(J);
figure(2);
plot(kk,GG)
tt=etime(clock,t1);
end
I=imread('1.jpg');
tmin=min(I(:));
tmax=max(I(:));
th=(tmin+tmax)/2;
ok=true;
while ok
g1=I>=th;
g2=I<th;
u1=mean(I(g1));
u2=mean(I(g2));
tnew=(u1+u2)/2;
if abs(th-tnew)<1
ok=0;
end
end
th=tnew;
th=floor(th);
Inew=im2bw(I,th/255);
subplot(1,2,1)
imshow(I);
title('原始图像');
subplot(1,2,2)
imshow(Inew);
t=['迭代法分割后的图像,阈值=' num2str(th)];
title(t);
A0=imread('1.jpg');
seed=[100,220];
thresh=15;%相似性选择阈值
A=rgb2gray(A0);
A=imadjust(A,[min(min(double(A)))/255,max(max(double(A)))/255],[]);
A=double(A);
B=A;
[r,c]=size(B);
n=r*c;
pixel_seed=A(seed(1),seed(2));
q=[seed(1) seed(2)];
top=1;
M=zeros(r,c);
M(seed(1),seed(2))=1;
count=1;
while top~=0;
r1=q(1,1);
c1=q(1,2);
p=A(r1,c1);
dge=0;
for i=-1:1
for j=-1:1
if r1+i<=r & r1+i>0 & c1+j<=c & c1+j>0
if abs(A(r1+i,c1+j)-p)<=thresh & M(r1+i,c1+j)~=1
top=top+1;
q(top,:)=[r1+i c1+j];
M(r1+i,c1+j)=1;
count=count+1;
B(r1+i,c1+j)=1;
end
if M(r1+i,c1+j)==0;
dge=1;
end
else
dge=1;
end
end
end
if dge~=1
B(r1,c1)=A(seed(1),seed(2));
end
if count>=n
top=1;
end
q=q(2:top,:);
top=top-1;
end
subplot(1,2,1),imshow(A,[]);
subplot(1,2,2),imshow(B,[]);
A0=imread('1.jpg');
seed=[100,220];
thresh=15;%相似性选择阈值
A=rgb2gray(A0);
A=imadjust(A,[min(min(double(A)))/255,max(max(double(A)))/255],[]);
A=double(A);
B=A;
[r,c]=size(B);
n=r*c;
pixel_seed=A(seed(1),seed(2));
q=[seed(1) seed(2)];
top=1;
M=zeros(r,c);
M(seed(1),seed(2))=1;
count=1;
while top~=0;
r1=q(1,1);
c1=q(1,2);
p=A(r1,c1);
dge=0;
for i=-1:1
for j=-1:1
if r1+i<=r & r1+i>0 & c1+j<=c & c1+j>0
if abs(A(r1+i,c1+j)-p)<=thresh & M(r1+i,c1+j)~=1
top=top+1;
q(top,:)=[r1+i c1+j];
M(r1+i,c1+j)=1;
count=count+1;
B(r1+i,c1+j)=1;
end
if M(r1+i,c1+j)==0;
dge=1;
end
else
dge=1;
end
end
end
if dge~=1
B(r1,c1)=A(seed(1),seed(2));
end
if count>=n
top=1;
end
q=q(2:top,:);
top=top-1;
end
subplot(1,2,1),imshow(A,[]);
subplot(1,2,2),imshow(B,[]);
A0=imread('1.jpg');
seed=[100,220];
thresh=15;%相似性选择阈值
A=rgb2gray(A0);
A=imadjust(A,[min(min(double(A)))/255,max(max(double(A)))/255],[]);
A=double(A);
B=A;
[r,c]=size(B);
n=r*c;
pixel_seed=A(seed(1),seed(2));
q=[seed(1) seed(2)];
top=1;
M=zeros(r,c);
M(seed(1),seed(2))=1;
count=1;
while top~=0;
r1=q(1,1);
c1=q(1,2);
p=A(r1,c1);
dge=0;
for i=-1:1
for j=-1:1
if r1+i<=r & r1+i>0 & c1+j<=c & c1+j>0
if abs(A(r1+i,c1+j)-p)<=thresh & M(r1+i,c1+j)~=1
top=top+1;
q(top,:)=[r1+i c1+j];
M(r1+i,c1+j)=1;
count=count+1;
B(r1+i,c1+j)=1;
end
if M(r1+i,c1+j)==0;
dge=1;
end
else
dge=1;
end
end
end
if dge~=1
B(r1,c1)=A(seed(1),seed(2));
end
if count>=n
top=1;
end
q=q(2:top,:);
top=top-1;
end
subplot(1,2,1),imshow(A,[]);
subplot(1,2,2),imshow(B,[]);
A0=imread('1.jpg');
seed=[100,220];
thresh=15;%相似性选择阈值
A=rgb2gray(A0);
A=imadjust(A,[min(min(double(A)))/255,max(max(double(A)))/255],[]);
A=double(A);
B=A;
[r,c]=size(B);
n=r*c;
pixel_seed=A(seed(1),seed(2));
q=[seed(1) seed(2)];
top=1;
M=zeros(r,c);
M(seed(1),seed(2))=1;
count=1;
while top~=0;
r1=q(1,1);
c1=q(1,2);
p=A(r1,c1);
dge=0;
for i=-1:1
for j=-1:1
if r1+i<=r & r1+i>0 & c1+j<=c & c1+j>0
if abs(A(r1+i,c1+j)-p)<=thresh & M(r1+i,c1+j)~=1
top=top+1;
q(top,:)=[r1+i c1+j];
M(r1+i,c1+j)=1;
count=count+1;
B(r1+i,c1+j)=1;
end
if M(r1+i,c1+j)==0;
dge=1;
end
else
dge=1;
end
end
end
if dge~=1
B(r1,c1)=A(seed(1),seed(2));
end
if count>=n
top=1;
end
q=q(2:top,:);
top=top-1;
end
subplot(1,2,1),imshow(A,[]);
subplot(1,2,2),imshow(B,[]);
标签:读数,end,r1,seed,仪表,图像,c1,指针式 From: https://blog.csdn.net/2401_86539719/article/details/141174933