数字图像处理.docx
《数字图像处理.docx》由会员分享,可在线阅读,更多相关《数字图像处理.docx(18页珍藏版)》请在冰豆网上搜索。
数字图像处理
一、数字图像处理的工业应用数字图像处理工业检测应用实例
1.数字图像处理的工业应用
工业和工程方面的应用在工业和工程领域中图像处理技术有着广泛的应用,如自动装配线中检测零件的质量、并对零件进行分类,印刷电路板疵病检查,弹性力学照片的应力分析,流体力学图片的阻力和升力分析,邮政信件的自动分拣,在一些有毒、放射性环境内识别工件及物体的形状和排列状态,先进的设计和制造技术中采用工业视觉等等。
其中值得一提的是研制具备视觉、听觉和触觉功能的智能机器人,将会给工农业生产带来新的激励,目前已在工业生产中的喷漆、焊接、装配中得到有效的利用。
2.数字图像处理工业检测应用实例
色织布的疵点自动检测算法
由于日益加速的计算能力和彩色相机设备的更新换代,人们对类似图1所示的色织布疵点图像进行实时处理。
色织布的图像处理属于彩色数字图像处理范围,色织布的疵点自动检测算法基础就是色彩模型、色彩量化和粉色技术。
1931年,国际照明委员会(CIE)规定用波长为900、546.1、435.8nm的单色光红(R)、绿(R)、蓝(B)作为三原色。
RGB颜色模型是三维直角坐标颜色系统中的一个单位正方体。
GIE颜色模型包括一系列颜色模型,这些颜色模型是由国际照明委员会提出的,是基于人的眼睛对RGB的反应,被用于精确表示对色彩的接收。
GIE的模型包括:
GIEXYZ,GIELab和GIEYuv等。
另外,CMY颜色模型是以红、绿、蓝3中颜色的补色青、品红、黄为原色构成的颜色模型。
HSV颜色模型由红、黄、绿、青、蓝、品红排列而成,每种颜色和它的补色相差180°,复合人眼对颜色的感觉。
相关的颜色模型制浆可以相互转换
机器视觉布匹疵点检测系统之色织布检测算法
1.1基于RGB空间的算法
色织布图像处理技术常常模仿灰度处理的方法,可以直接在RGB颜色空间的各个色彩平面进行处理。
Caelli等在RGB颜色空间用多尺度各向同性滤波器处理图像,特征从每个通道中提取,然后合并起来分类检测。
Maenpaa等测量基于RGB通道累积直方图的颜色表示作为彩色特征,用共生矩阵和LBP算子表示纹理特征,对木块表面纹理疵点进行检测。
1.2变换到其他颜色空间的方法
彩色织布图像处理可以从RGB空间变换到其他空间,把色彩通道和亮度通道分开,对图像进行分析。
Liapis等把彩色织布图像变换到Lab空间,在L通道进行离散小波变换,提取灰度疵点的特征,在a和b通道得到局部直方图,用作颜色疵点特征的提取。
近来,Tsai等也将彩色纹理图像变换到Lab颜色空间,这个空间中每个像素的两个色彩用色相和浓度表示,在这两个通道中用Gabor滤波检测疵点。
文献论证了在这两个通道中处理图像受光照强度的变化影响最小,并假设疵点是从颜色上可以区分的。
然而一大批疵点的产生是由于灰度的不规则引起的,例如,和亮度变化有关的疵点不能引起色相和浓度的不同,因此,也有其局限性。
图14种色织布疵点图像
1.3考虑颜色各通道之间相关性的方法
在彩色图像疵点检测的分析中,提取通道之间的相关性是非常重要的。
灰度纹理分析技术被应用在每个通道,而不同通道之间的像素相互作用也应考滤到,如Rosenfeld等是最早提出这种彩色图像处理技术的研究者之一。
Panjwani等设计了一个GMRF模型以解码彩色通道内和通道之间的空间相关性。
Jain等在每个彩色通道里应用Gabor滤波器滤波,可以获得每个通道的纹理特征,通过取得了颜色通道之间空间相关性获得对方通道的特征。
Kittler等通过二值化空间像素分布分析完成颜色聚类,识别彩色瓷砖图像的疵点,考虑了颜色聚类与空域中的二值图像的空域和频域的相互作用。
1.4在全三维颜色空间的方法
迄今为止,为了处理彩色纹理图像而在完全三维空间的模型研究相对有限,三维数据空间常常被用上面提到的方法变形,用低维空间的方法建模和分析数据。
然而,由于彩色图像数据空间通道间只能近似非相关,所以这些方法不可避免地使信息受到损失。
Jojic等和Xie等用Epitom和Texem模型给出了紧密的三维彩色图像纹理的描述。
图像被假设成依赖图像块里原始像素值的基元的集合,1个块的中心点的邻域被假设为统计条件下是独立的。
在Epitome模型里,一个隐藏的映射图Epitome表示原始图像;在Texem模型里,详细的映射图由多级较小的Epitome描述。
这些紧密的表示方法本身同时具有空域和频域的相互作用特性。
但是,在全三维色彩空间的疵点检测计算代价较大,为了适应实时处理,需要配置特殊的硬件和软件。
总而言之,彩色图像分析的织物疵点检测算法有待进一步研究和发展,己报道的文章极其有限,而且仅是针对所有领域彩色纹理图像,比较笼统。
由于色织布的彩色纹理图像处理有其特殊性,用机器视觉和图像处理检测疵点有一定困难,但是随着色织布的生产和出口量日益上升,代替人工检测和分类的有效自动色织布疵点检测系统的需求越来越迫切。
二、机器视觉的应用、现状和发展前景机器视觉与图像处理的关系
1、自动印刷品质量检测
设备采用的检测系统多是先利用高清晰度、高速摄像镜头拍摄标准图像,在此基础上设定一定标准;然后拍摄被检测的图像,再将两者进行对比。
2、凹版印刷机位置控制及产品检测
由设置在生产线上的摄像机连续摄取印制品的视频图像,摄像的速度在30帧/s以下且可调。
摄像机采集到的图像,首先进行量化,将模拟信号转化成数字信号,从中抽取一张有效代表镜头内容的关键帧,并将其显示在显示器上。
对于一帧图像,可采用对静止图像的分析方法来处理,通过尺寸测量和多光谱分析可识别出视频图像上各色标,得出色标间距和色标的颜色参数以及一些其他相关。
3、在现代包装行业中的应用
在现代包装工业自动化生产中,涉及到各种各样的检查、测量,比如饮料瓶盖的印刷质量检查,产品包装上的条码和字符识别等。
机器视觉现状和发展前景
在机器视觉系统中,关键技术有光源照明技术、光学镜头、摄像机、图像采集卡、图像处理卡和快速准确的执行机构等方面。
在机器视觉应用系统中;好的光源与照明方案往往是整个系统成败的关键;起着非常重要的作用;它并不是简单的照亮物体而已。
光源与照明方案的配合应尽可能地突出物体特征量;在物体需要检测的部分与那些不重要部份之间应尽可能地产生明显的区别;增加对比度;同时还应保证足够的整体亮度;物体位置的变化不应该影响成像的质量。
在机器视觉应用系统中一般使用透射光和反射光。
对于反射光情况应充分考虑光源和光学镜头的相对位置、物体表面的纹理;物体的几何形状、背景等要素。
光源的选择必须符合所需的几何形状、照明亮度、均匀度、发光的光谱特性等;同时还要考虑光源的发光效率和使用寿命。
光学镜头相当于人眼的晶状体;在机器视觉系统中非常重要。
一个镜头的成像质量优劣;即其对像差校正的优良与否;可通过像差大小来衡量;常见的像差有球差、彗差、像散、场曲、畸变、色差等六种。
摄像机和图像采集卡共同完成对物料图像的采集与数字化。
高质量的图像信息是系统正确判断和决策的原始依据;是整个系统成功与否的又一关键所在。
目前在机器视觉系统中;CCD摄像机以其体积小巧、性能可靠、清晰度高等优点得到了广泛使用。
CCD摄像机按照其使用的CCD器件可以分为线阵式和面阵式两大类。
线阵CCD摄像机一次只能获得图像的一行信息;被拍摄的物体必须以直线形式从摄像机前移过;才能获得完整的图像;因此非常适合对以一定速度匀速运动的物料流的图像检测;而面阵CCD摄像机则可以一次获得整幅图像的信息。
图像信号的处理是机器视觉系统的核心;它相当于人的大脑。
如何对图像进行处理和运算;即算法都体现在这里;是机器视觉系统开发中的重点和难点所在。
随着计算机技术、微电子技术和大规模集成电路技术的快速发展;为了提高系统的实时性;对图像处理的很多工作都可以借助硬件完成;如DSP、专用图像信号处理卡等;软件则主要完成算法中非常复杂、不太成熟、尚需不断探索和改变的部分。
从产品本身看,机器视觉会越来越趋于依靠PC技术,并且与数据采集等其他控制和测量的集成会更紧密。
且基于嵌入式的产品将逐渐取代板卡式产品,这是一个不断增长的趋势。
主要原因是随着计算机技术和微电子技术的迅速发展,嵌入式系统应用领域越来越广泛,尤其是其具备低功耗技术的特点得到人们的重视。
另外,嵌入式操作系统绝大部分是以C语言为基础的,因此使用C高级语言进行嵌入式系统开发是一项带有基础性的工作,使用高级语言的优点是可以提高工作效率,缩短开发周期,更主要的是开发出的产品可靠性高、可维护性好、便于不断完善和升级换代等。
因此,嵌入式产品将会取代板卡式产品。
由于机器视觉是自动化的一部分,没有自动化就不会有机器视觉,机器视觉软硬件产品正逐渐成为协作生产制造过程中不同阶段的核心系统,无论是用户还是硬件供应商都将机器视觉产品作为生产线上信息收集的工具,这就要求机器视觉产品大量采用标准化技术,直观的说就是要随着自动化的开放而逐渐开放,可以根据用户的需求进行二次开发。
当今,自动化企业正在倡导软硬一体化解决方案,机器视觉的厂商在未来5-6年内也应该不单纯是只提供产品的供应商,而是逐渐向一体化解决方案的系统集成商迈进。
在未来的几年内,随着中国加工制造业的发展,对于机器视觉的需求也逐渐增多;随着机器视觉产品的增多,技术的提高,国内机器视觉的应用状况将由初期的低端转向高端。
由于机器视觉的介入,自动化将朝着更智能、更快速的方向发展。
机器视觉与图像处理的关系
图像处理的主要功能是将获得的低质量图像(反差小,模糊,变形等)用计算机处理成更适合人眼观察或仪器检测的图像。
而机器视觉中,视觉信息的处理技术主要依赖于图像处理方法,它包括图像增强、数据编码和传输、平滑、边缘锐化、分割、特征抽取、图像识别与理解等内容。
经过这些处理后,输出图像的质量得到相当程度的改善,既改善了图像的视觉效果,又便于计算机对图像进行分析、处理和识别。
简单来说,机器视觉就是给机器增加一个智能的眼睛,让机器具备视觉的功能,能看能检测能判断,可以替代传统的人工或者简单的机械治具。
其原理是将需检测的产品或区域进行成像,然后根据其图像信息用专用的图像处理软件进行处理,根据处理结果软件能自动判断产品的位置、尺寸、外观信息,并根据人为预先设定的标准进行合格与否的判断,输出其判断信息给执行机构。
由此,看出图像处理是机器视觉内在的工具,将机器的眼睛变得更好用。
先根据图像处理标准,人为对机器眼睛进行预设,接着机器的眼睛所看的图像,把图像拿到图像处理中绘制到计算机,最后计算机分析,处理和识别。
三、数字图像处理的工业应用
大体步骤是:
首先进行边缘检测,然后进行填充。
然后进行开运算,可以使一些轻微连着的米粒分开来。
然后是遍历图片,把各米粒进行标号,从1开始从小到大标号。
每个米粒的各像素点值相同,第i个米粒的各像素点值均为i。
其中采用了队列,用数组模拟。
最大的米粒标号便是米粒的总个数。
最后,遍历一遍图像数组,便可求出各米粒的面积。
参考代码(matlab实现):
clear;
closeall;
I=imread('rice.png');
[width,height]=size(I);
J=edge(I,'canny');
%figure,imshow(J);
K=imfill(J,'holes');
%figure,imshow(K);
SE=strel('disk',3);%用于膨胀腐蚀及开闭运算等操作的结构元素对象
%对图像实现开运算,开运算一般能平滑图像的轮廓,消弱狭窄的部分,去掉细的突出。
L=imopen(K,SE);
figure,imshow(L);
L=uint8(L);%把L由logic类型转化为uint8类型
fori=1:
height
forj=1:
width
ifL(i,j)==1
L(i,j)=255;%把白色像素点像素值赋值为255
end
end
end
MAXSIZE=999999;
Q=zeros(MAXSIZE,2);%用数组模拟队列,存储像素点坐标
front=1;%指明队头的位置
rear=1;%指明队尾的下一个位置;front=rear表示队空
flag=0;%米粒的标号
fori=1:
height
forj=1:
width
ifL(i,j)==255%白色像素点入队列
iffront==rear%队列空,找到新米粒,米粒标号加一
flag=flag+1;
end
L(i,j)=flag;%给白色像素赋值为米粒的标号
Q(rear,1)=i;
Q(rear,2)=j;
rear=rear+1;%队尾后移
whilefront~=rear
%队头出队
temp_i=Q(front,1);
temp_j=Q(front,2);
front=front+1;
%把队头位置像素点8连通邻域中未作标记的白色像素点入队,并加上米粒标号
%左上角的像素点
ifL(temp_i-1,temp_j-1)==255
L(temp_i-1,temp_j-1)=flag;
Q(rear,1)=temp_i-1;
Q(rear,2)=temp_j-1;
rear=rear+1;
end
%正上方的像素点
ifL(temp_i-1,temp_j)==255
L(temp_i-1,temp_j)=flag;
Q(rear,1)=temp_i-1;
Q(rear,2)=temp_j;
rear=rear+1;
end
%右上方的像素点
ifL(temp_i-1,temp_j+1)==255
L(temp_i-1,temp_j+1)=flag;
Q(rear,1)=temp_i-1;
Q(rear,2)=temp_j+1;
rear=rear+1;
end
%正左方的像素点
ifL(temp_i,temp_j-1)==255
L(temp_i,temp_j-1)=flag;
Q(rear,1)=temp_i;
Q(rear,2)=temp_j-1;
rear=rear+1;
end
%正右方的像素点
ifL(temp_i,temp_j+1)==255
L(temp_i,temp_j+1)=flag;
Q(rear,1)=temp_i;
Q(rear,2)=temp_j+1;
rear=rear+1;
end
%左下方的像素点
ifL(temp_i+1,temp_j-1)==255
L(temp_i+1,temp_j-1)=flag;
Q(rear,1)=temp_i+1;
Q(rear,2)=temp_j-1;
rear=rear+1;
end
%正下方的像素点
ifL(temp_i+1,temp_j)==255
L(temp_i+1,temp_j)=flag;
Q(rear,1)=temp_i+1;
Q(rear,2)=temp_j;
rear=rear+1;
end
%右下方的像素点
ifL(temp_i+1,temp_j+1)==255
L(temp_i+1,temp_j+1)=flag;
Q(rear,1)=temp_i+1;
Q(rear,2)=temp_j+1;
rear=rear+1;
end
end
end
end
end
figure,imshow(L);
RiceNumber=flag;%记录米粒的总个数
disp('米粒的总个数:
')
RiceNumber
RiceArea=zeros(1,RiceNumber);%记录各米粒的大小
fori=1:
height
forj=1:
width
ifL(i,j)~=0
RiceArea(L(i,j))=RiceArea(L(i,j))+1;
end
end
end
disp('各米粒的大小(按照从上往下,从左往右的顺序):
')
RiceArea
运行结果:
边缘检测,填充,开运算之后的结果:
可以看出有些轻微连着的米粒被分开了。
进行标号后的结果:
米粒是从上到下从左到右依次编号的。
从图中米粒的明暗程度可以看出来。
最终结果:
米粒的总个数:
RiceNumber=
69
各米粒的大小(按照从上往下,从左往右的顺序):
RiceArea=
Columns1through20
212146197179224431208182147189236214207202138188158202210181
Columns21through40
186211199227203223224227249254225187183200232199210200198183
Columns41through60
230268233235193206240158207215238200239227207254237203211236
Columns61through69
219152225238169223215195195
四、计算pcb.png图中各焊盘的图像坐标
dev_close_window()
dev_open_window(0,0,1109/2,871/2,'black',WindowHandle)
read_image(Image,'pcb')
threshold(Image,Region,0,100)
erosion_circle(Region,RegionErosion,11.5)
connection(RegionErosion,ConnectedRegions)
dilation_circle(ConnectedRegions,RegionDilation,11.5)
dev_display(Image)
dev_display(RegionDilation)
*以上是halcon中的例子,hdevelop/Regions/Features/rectangularity.hdev
area_center(RegionDilation,Area,Row,Column)
voidmain()
{
IplImage*src=cvLoadImage("1.jpg",CV_LOAD_IMAGE_UNCHANGED);//三通道的彩色图像
IplImage*dst=cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1);
cvCvtColor(src,dst,CV_RGB2GRAY);
for(inti=0;iheight;i++)//反色
{
uchar*ptr=(uchar*)(dst->imageData+i*dst->widthStep);
for(intj=0;jwidth;j++)
{
ptr[j]=255-ptr[j];
}
}
cvSmooth(dst,dst,CV_MEDIAN,11);
cvThreshold(dst,dst,200,255,CV_THRESH_TOZERO);
//创建核,结构元素原点非常重要,
//以5*5的核为例,中心点在(2,2)位置,改为(1,1)后,画出整个轮廓向左上角平移
IplConvKernel*myModel=cvCreateStructuringElementEx(5,5,2,2,CV_SHAPE_ELLIPSE);
/*cvErode(dst,dst,myModel,3);*/
/*cvDilate(dst,dst,myModel,2);*/
/*cvMorphologyEx(dst,dst,NULL,NULL,CV_MOP_OPEN,1);*/
cvMorphologyEx(dst,dst,NULL,myModel,CV_MOP_OPEN,4);
/*cvMorphologyEx(dst,dst,NULL,NULL,CV_MOP_CLOSE,1);*/
//////////////////////////////////////////////////////////////////////////
/*
*从上面的二值图可以看出,对于圆提取影响较大的是矩形
*而矩形和圆分开,可以用圆形度特征分开,实践证明该方法不可行
*另一种思路:
比较矩形和圆轮廓的外接矩形,利用长与宽的差值作为特征来实现
*/
//利用圆形度来检测
//for(CvSeq*c=contour;c!
=NULL;c=c->h_next)
//{
////实验表明圆形度不可用
////计算轮廓面积
//doublearea=cvContourArea(c,CV_WHOLE_SEQ);
////计算轮廓周长
//doublelength=cvArcLength(c,CV_WHOLE_SEQ,-1);
//std:
:
cout<
:
endl;
////计算圆形度
//doublee=4*CV_PI*abs(area)/(length*length);
//
////判断轮廓是否为圆
//if(e>=0.885)
//{
//cvDrawContours(dst,c,cvScalarAll(255),cvScalarAll(255),10,1);
//}
//}
CvMemStorage*storage=cvCreateMemStorage();
//寻找轮廓
CvSeq*contour=NULL;
CvContourScannerscanner=cvStartFindContours(dst,storage,sizeof(CvContour),
CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));
CvSeq*sq=NULL;
do
{
sq=cvFindNextContour(scanner);
if(sq==NULL)break;
//计算外接矩形
CvRectrect=cvBoundingRect(