本文主要是介绍MATLAB指针式仪表自动读数系统设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、课题介绍
随着模式识别技术、计算机技术等多种技术的不断完善和发展,机器视觉获得了巨大的进步与发展。目前在许多企业中,存在着大量的仪表,仪表的读数都要靠人来完成,工作量很大而且误差率相对来说比较高,基于这个原因,设计了一个工业生产线在线检测数据数字化处理系统。首先通过摄像头采集仪表图像,通过传输装置以无线的方式把图像传输到电脑上,然后在电脑上通过matlab程序设计,处理图像,读取仪表的数据,然后用labview调用matlab程序,并设计一个显示界面,通过界面可以看到实时的数据与仪表图像以及在一段时间内数据的变化情况。最后通过labview访问access数据库,将读取的数据传入数据库中,便于被调用,最终实现检测数据的数字化处理。
二、课题背景
近年来,随着科学技术的进步,许多新兴的技术不断的产生与发展,机器视觉技术也随着图像处理等技术的发展而逐渐产生,而且发展很快。近些年来,世界范围内涌现了许多的专门从事机器视觉技术的公司,有许多的公司得到了很好的利润。现阶段,国内的机器视觉技术虽然刚起步不长的时间,但是,也有几家公司在这方面取得了不错的成绩,并且发展的速度也很快。所谓的机器视觉是以通过处理图像达到类似于人眼的视觉的效果,提高工作效率减轻人的工作负担,为最终目的。相比于人类的视觉,首先机器视觉不会出现疲劳现象,而且机器视觉识别的精度可以比人眼的识别的精度还要高一些。目前,很多领域中都出现了机器视觉技术的影子,这也体现出了机器视觉技术的研究价值。主要应用的领域有:医学领域、工业检测领域、监控管理、航天领域等。当机器视觉技术应用于工业检测领域时,可以实现工业生产线在线检测数据的自动读取,提高读数的准确性,有效减轻人的负担,及时准确的发现问题、解决问题。
进入21世纪后,电子类的仪表应用的越来越多,准确度更高的数字式仪表大有取代传统的指针式仪表的趋势。但是,数字式的仪表在某些情况下不能使用,对环境的适应性比较差,比如,在读数快速变化的时候就不适合使用了,而且,相比于指针式仪表来说,数字仪表价格相对较高,大批量的购买成本会上升很多。指针式仪表则可以适用于很多的场合,环境因素对其约束相对来说不大。除此之外,指针式仪表还有许多其他的优点,比如,抗干扰性强,防尘,防水等,因此我们国家的许多行业中,尤其是那些严禁易燃易爆的场合,比如电力、石油、化工等,指针式仪表仍然是首选,在环境恶劣的场合,根本无法使用数字式的仪表。在一般的工厂中,指针式的仪表数量大、种类多,这些仪表的读数十分的麻烦,而且工作量很大,工作效率很低。传统上人们是检定指针式仪表的方法是人工判读,但是这种判别方法会受到许多人为因素的干扰,比如人的观测仪表角度、疲劳强度以及观测的距离,具有工作强度大,误差率大等缺点,不能实现仪表读数与检测的自动化。每个仪表都需要依靠人来瞄准,每个仪表的操作也需要依靠人来完成,这种方式的工作量大,效率低。
为了缩短检测的时间,有效减轻工作人员工作强度 ,提高检测工作的自动化水平,设计工业生产线在线检测数据数字化处理系统是很有必要的。利用机器视觉技术,可以实现仪表图像的采集、识别以及仪表数据的读取,而整个设计的关键就在于如何用图像识别的方式识别仪表,读取数据。
三、课题研究现状
工业生产线在线监测数据的数字化处理系统的设计的核心是使用图像识别的方法识别仪表,指针式仪表的读数识别研究起步相对来说较晚,1994年,sablatnig等人提出了利用hough变换来检测指针式仪表的读数的方法[1][1]。1995 年,韩国的 Kyong-Ho Kim 等人成功的实现了对核装置数字表的图像分割,采用的方法是区域划分和阈值法,最终采取一系列的措施,建立一个完全自动化仪表识别系统[2][2]。Correa Alegria等人完成了利用机器视觉技术对指针式仪表的检定,整个过程为,首先使用摄像头采集图像,然后采用减影法处理图像,保存图像,然后利用霍夫变换检测直线,识别指针,并且读出指针的角度然,最后,根据指针角度通过计算,得到指针的读数[3][3]。孙凤杰等人提出一种新的提取指针的方法,这种新方法适合较差光照条件下使用,从而解决了光照条件对指针分割的约束问题,取得了较好的识别效果[4][4]。黎明和王厚枢设计了一个飞机座舱仪表读数的识别系统,这个系统首先进行图像二值化,主要运用的小波变换来提取指针及刻度,并且成功的去除了光线以及各种外部噪声对整个读数系统的影响,检测出指针和刻度后,找到仪表圆心,测量出指针的角度,找到指针角度与读数的关系,并成功读取数据,这个系统的识别精度很高,完全高于人眼的识别,而且成功实现了在线测试[5][5]。周洪和钟明慧成功的实现了指针式的仪表的数据的自动读取。这种读数方法突破了距离的限制,可以远距离的通过读取到仪表的读书,而且读数准确,延迟也很小,可以在线测试,整个系统的安装也很简单,而且成本也很低,对于一些危险场合的仪表读数具有重要的现实意义[6][6]。2007年,杨晓敏等人设计了一种新的识别方法,这种方法的原理与车牌识别的远离非常相似模,是一种高斯混合模型识别方法[7][7]。何智杰等人设计了一种新的仪表读数的识别方法,这种新方法特别适合精度很高的指针仪表,这个方法中主要运用了霍夫变换和中心投影分析法,这种方法可以实现刻度的全自动识别,而且还提高了识别的精度和速度[8][8]。宁志刚等提出一种可应用于高精度指针仪表读数的方法,该方法的原理是利用脊波来提取仪表图像中的直线,可实现自动跟踪判读[9][9]。
四、系统总体方案设计
4.1设计方案
工业生产线在线检测数据数字化处理系统主要由图像采集装置、图像发射与接受装置、图像处理部分以及客户端等部分组成。设计方案如下所示:
图像发射与接收装置采用的是无线影音发射器,图像处理部分是由matlab来完成的,而客户端则是由labview来设计的。
4.2图像处理与仪表数据的读取
4.2.1图像预处理
在图像采集的过程中,会受到许多的干扰,包括自身的和外界的,例如,外界光照条件的影响,摄像头像素的高低,仪表表盘的清洁程度以及各种振动及噪声的干扰。受到诸多的干扰后得到的照片可能会是模糊的,可能无法获取我们需要的信息,要想得到有用的信息就必须想办法去掉这些干扰。我们通过摄像头的到的图像都是彩色的,里面蕴含了大量的信息,处理起来相当繁琐,而且计算也非常复杂,容易出现错误,所以为了处理简单,必须要把彩色图片转化为蕴含信息比较少的灰度图片。这些都是要通过图像预处理来实现,图像预处理的目的是去除图像上的噪声,减少图像的信息,简化运算,为图像处理打好基础。图像预处理包括:图像滤波去噪,图像增强,图像二值化,边缘检测与图像检测。
4.2.1.1图像滤波去噪
图像在采集、获取和传输的过程中,几乎所有的图像都会收到不同程度的噪声污染,这些噪声有的是可见的,有的是不可见的,有的噪声污染在图像上体现的很明显,有的则是难以察觉的。对于不同的地点,信噪比是不同的,信噪比越大,图像的质量则越好,但当信噪比低于一定的数值时,噪声将会变成人眼可见的颗粒状,图片就会变得模糊起来,图片质量也会相应的下降。更重要的是,噪声所产生的颗粒有可能会掩盖我们需要的信息细节,由于在工厂中采集图像的过程中,噪声污染是不可避免的,而且噪声污染体现在视觉上也是比较明显的,所以必须要对图像进行滤波去噪的处理,因为摄像头所采集到的照片是彩色的,数据量很大,计算复杂,处理起来容易出错,而颜色信息对于最终的读数是没有影响的,所以,为了简化运算,使图像的处理变得先对简单,在滤波去噪之前,先要对图像进行灰度化处理,然后再进行滤波,在本设计中采用的是中值滤波.
图3-7 加入盐噪声的图片与滤波后的图片
4.2.1.2图像增强
图像增强是以改善图像的视觉效果为根本目的的,在采集图像的过程中,特别是在工厂中,光照条件对图片质量的影响十分明显,而拍摄的过程中可能会出现曝光过度或者曝光不足的现象,这样得到的图像将会是模糊的,表盘上的指针刻度区域与背景区域的区分不是很明显,不利于仪表图像的识别。为了使表盘上指针刻度区域与背景区域的界限变得明显,需要对图像进行空间域的图像增强。空间域的的图像增强主要有两种方式,直方图的均衡化处理和灰度变换,本设计中采用的是灰度变换。
图像增强的主要程序为:
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 增强后的图片
3.2.1.3二值化处理
进行完图像增强后的图像是灰度图像,灰度图像的每个像素都可以在0-255之间取值,每个像素都可以有如此多的取值,这样的图像计算和处理起来十分的麻烦,而且容易出错,所以,就要对图像进行二值化处理,使图像的每个像素只能去0与1两个值,“0”作为目标区域,“1”作为背景区域,反之,亦可以,这样计算将变得相对简单,也不容易出错。用来划分背景区域和目标区域的那个灰度值就称作为阈值,大于阈值的像素值全部设为1,小于阈值的则全部设为0.图像的二值化[10][11]处理是图像处理中最常用的技术,在图像处理中具有至关重要的地位。主要有三个原因,首先,在彩色图像或者灰度图像的处理过程中,都要先将图像进行二值化处理,然后再进行更深层次的计算。其次,在理论上和方法上图像二值化比灰度图像处理更加系统化,也更加稳定。 第三,当图像处理的对象是文字或者图纸的时候,从本质上来说,背景和图形也是一种二值化的图像。图像二值化的主要程序为:
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 二值化图片
4.2.1.4边缘检测与图像分割
对于图像处理来说,边缘检测是必须的。因为从边缘的定义上就可以看出,边缘是图像的重要的基本特征。边缘蕴含着图像的方向、阶跃性质与形状重要的信息,而这些信息十分的重要,它可以应用在在图像分割、特征提取、图像分类、图像配准以及图像识别中。图像边缘可以分为两大类,一类是阶跃状边缘,另一类是屋顶状边缘,其中两边灰度值有明显的变化的是阶跃状边缘;而在灰度减小和增加的交界处的是屋顶状边缘。首先通过利用边缘增强算子,来突出图像中局边缘,然后再定义像素的“边缘强度”,最后通过设置阈值来提取边缘点集是边缘检测的基本的思想。边缘检测方法有Sobel算子法[11][12]、 Robert算子法[12][13]、 PreWltt算子法[13][14]、LOG算子法、Canny算子法、Zerocross算子法[14][15]以及二值图像边缘检测法等。这些算法各有特点,适用的条件也不一样。本设计中采用的是Sobel算子法。
图4-10为边缘检测的结果
图4-10 边缘检测
4.2.2指针识别
指针的识别可以说是识别读数最为重要的环节,仪表的读数都是有指针决定的,指针在采集图像的过程中会连续的变换指向,在摄像头与表盘无相对运动的情况下,摄像头采集到的指针位置不同的两幅图像,指针也可以看作一条直线,而且比其他刻度线都要长很多,所以可以采用霍夫变换来检测指针,以及识别其他的刻度。
霍夫变换在图像处理中一种应用很广泛的识别几何形状的方法,以霍夫变换额、为原理,衍生出许多其他的算法,但是从黑白图像中检测直线或者线段是最基本的霍夫变换。本设计中指针检测的主要思路为,首先通过霍夫检测检测出所有的直线,包括所有的刻度和指针,而指针则是所有直线中最长的,所以,接下来设计程序求这些所检测出的直线中的最长的线,然后对直线的起始位置进行标记,并对直线进行标记。
图4-11为利用霍夫变换检测直线,图4-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
图4-11 霍夫变换检测直线
图4-12 指针识别
4.2.3读数识别
仪表表盘的读数识别是整个读数系统中最为重要的的部分,目前读数识别的方法多种多样,经过在工厂的实地考察,发现该工厂的有些材料生产车间环境相对较差,表盘难以时刻保持清洁,总是沾带有大量的粉尘,通过距离法读取表盘的读数相对来说比较困难,也不够稳定,而选取通过指针角度来读取表盘数据则可以更好的适应环境,提高读数的稳定性。读数识别的主要程序如下:
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);
4.3数据显示界面的设计
表盘数据读取出来后,需要直观的显示出来,这时就需要搭建一个显示界面,如今,有多种软件可实现见面搭建的功能,本设计中选择的是GUI图形化编程软件。
图4-13 前面板
五、 matlab源码程序
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;
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;
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;
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,[]);
- ↑
- ↑
- ↑
- ↑
- ↑
- ↑
- ↑
- ↑
- ↑
- ↑
- ↑
- ↑
- ↑
- ↑
这篇关于MATLAB指针式仪表自动读数系统设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!