数字图像处理课件设计报告工件尺寸图像测量.docx
《数字图像处理课件设计报告工件尺寸图像测量.docx》由会员分享,可在线阅读,更多相关《数字图像处理课件设计报告工件尺寸图像测量.docx(25页珍藏版)》请在冰豆网上搜索。
![数字图像处理课件设计报告工件尺寸图像测量.docx](https://file1.bdocx.com/fileroot1/2023-1/2/00d6ef6e-c2d2-4038-96e7-7440504ecb9c/00d6ef6e-c2d2-4038-96e7-7440504ecb9c1.gif)
数字图像处理课件设计报告工件尺寸图像测量
数字图像处理
课程设计报告
课设题目:
工件尺寸的图像测量
学院:
信息与电气工程学院
专业:
电子与信息工程
班级:
0902501班
姓名:
高秀政
学号:
090250106
指导教师:
周志权于海雁赵占峰
哈尔滨工业大学(威海)
2012年
10月
31日
不要删除行尾的分节符,此行不会被打印
目录
目录I
一.课程设计任务1
1.1设计目的1
1.2设计要求1
二.课程设计原理及设计方案2
2.1设计原理的选择2
2.2设计方案4
2.3设计流程图5
三.课程设计的步骤和结果6
3.1图像文件管理6
3.2图像预处理9
3.3尺寸与距离测量16
四.课程设计总结21
五.设计体会22
六.参考文献23
一.课程设计任务
1.1设计目的
数字图像处理,就是用数字计算机及其他有关数字技术,对图像进行处理,以达到预期的目的。
随着计算机的发展,图像处理技术在许多领域得到了广泛应用,数字图像处理已成为电子信息、通信、计算机、自动化、信号处理等专业的重要课程。
数字图像处理课程设计是在学习完数字图像处理的相关理论后,进行的综合性训练课程,其目的是:
Ø使学生进一步巩固数字图像处理的基本概念、理论、分析方法和实现方法;
Ø增强学生应用Matlab编写数字图像处理的应用程序及分析、解决实际问题的能力;
尝试所学的内容解决实际工程问题,培养学生的工程实践能力。
1.2设计要求
在加工制造领域,需要对很多零部件尺寸进行测量,以验证零件是否符合加工要求。
一般这种测量可以通过千分尺或游标卡尺完成。
但对于很多易碎或易变形的零件,类似的测量几乎难以完成。
在这种场合,一般要求采用非接触测量方法,图像测量就是其中的方法之一。
试设计一应用软件,能够对标准形状的零件进行图像测量。
要求完成功能:
1、能够读取和存储图像,对图像进行去噪和对比度增强;
2、能够根据控制点对图像失真进行几何校正;
3、根据控制点对图像进行定标,建立像素与实际尺寸之间的对应关系;
4、对于非标准零件,利用人工鼠标操作,测量任意指定点间的距离;
5、对圆形标准零件进行自动尺寸测量(提高部分);
6、设计软件界面。
二.课程设计原理及设计方案
2.1设计原理的选择
2.1.1滤波去噪
由于图像中不可避免地存在噪声,故在图像预处理过程中需要对噪声进行滤除。
一些常见的噪声有椒盐噪声、脉冲噪声、高斯噪声等。
椒盐噪声是含随机出现的黑白亮度值,脉冲噪声是只含有随机的白强度值(正脉冲噪声)和黑强度值。
与强两者不同,高斯噪声是含有亮度服从高斯或正态分布的噪声。
图像的平滑处理在空间域和频域采取不同的方法,空间域滤波是在图像空间借助模版进行邻域操作,一般分为线性和非线性两类。
1.线性平滑滤波器对去除高斯噪声有很好的效果,大多数情况下对其他来性的噪声也有很好的效果。
最简单的线性滤波是均值滤波,即对局部进行均值计算,每一像素点的灰度值用其邻域内的各点灰度值的均值来置换。
但是邻域N的大小控制着滤波程度,大尺度滤波器会加大滤波程度,作为消除大噪声的代价,大尺度滤波器会导致细节的损失和计算量的增加,使得图像的尖锐部分变模糊。
2.中值滤波法是一种较好的非线性滤波方法,它将每一象素点的灰度值设置为该点某邻域窗口内的所有象素点灰度值的中值,在去除图像脉冲噪声、椒盐噪声的同时,又能保留图像的边缘细节,有效地保持图像轮廓的清晰。
设G(x,y)表示原始图像在(x,y)处的灰度值,选用N*N的正方形窗口(N一般取3或5),F(x,y)表示滤波后的图像在(x,y)处的灰度值,Med{}表示对窗口求中值,则中值滤波的输出可表达为:
2.1.2几何校正
数字图像几何变形是指图像上的像元在图像坐标系的坐标与其在实际元件等参考坐标系之间的坐标不一致,从而导致图像行列式不均匀、像元大小和位置与实际对应不准确、形状不规则等。
图像的总体几何变形是平移、缩放、旋转、偏扭、弯曲及其其他变形的综合作用结果。
对于图像的几何校正有直接和间接两种方法,其关键环节在于:
一是像素坐标变换;而是像素亮度值冲采样。
在对工件进行图像采集时,主要涉及到的几何变形是投影畸变,形象的说获得的图像就像是影子近大远小,因此只要在采集图像时设置四个控制点,根据我们已知控制点的标准图像和获得的畸变的控制点图像建立传输函数,利用传输函数对元件的畸变图像反变换获得理想的元件图像。
2.1.3测量定标
元件尺寸的图像测量,是建立在实际尺寸与像素关系已知的基础上的,通过检测元件的像素个数,以及像素与实际尺寸的对应关系(图像分辨率)求得元件的实际尺寸。
对于扫描仪等设备获取的图像,因为其设备为固定高度且步进电机匀速扫描采集信息,则可以获取元件图像的像素分辨率(像素/英寸dpi),然后直接利用此分辨率进行测距计算。
而大部分图像,包括相机、摄像头获取,或者从屏幕上截取得到,其图像分辨率已经发生变化,或者根本没有任何实际意义,这是就需要对图像进行尺寸定标。
在获取元件图像的同时,放置已知具体实际尺寸的标定物,在获取图像后与元件图像一起进行相同的几何校正等一系列操作,最终求的其像素数,从而获得像素数与实际尺寸的比例关系,设为分辨率dpi,进行元件实际尺寸的测量计算。
2.1.4增强对比度和二值化处理
经过几何校正后的图像则可以用于尺寸测量,但由于背景的影响,在检测元件边缘时会有较大的误差,因而更好的办法是增强对比度后设置门限,对图像进行二值化处理。
1.在数字图像处理中,二值图像占有非常重要的地位,二值化后的图像更容易检测元件图像的边缘。
图像的二值化有利于图像的进一步处理,使图像变得简单,而且数据量减小,能凸显出感兴趣的目标的轮廓。
其次,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像。
2.为了方便选取二值化所需的阈值,我们希望图像的直方图是一个标准的双峰一谷,则直接在谷底处取得阈值,使一侧为0另一侧为1,因此需要对图像首先进行对比度增强。
如果原图象f(x,y)的灰度范围是[m,M],我们希望调整后的图象g(x,y)的灰度范围是[n,N],利用MATLAB图象处理工具箱中提供的imadjust函数,可以很容易实现上述线性变换的对比度增强。
2.1.5投影法自动测距
投影法就是统计目标像素在水平方向(x轴)和竖直方向(y轴)上累计的个数,然后画出统计图形。
根据本次统计图形的零极点判断元件图像的边缘,测得边缘之间的距离即为所求元件的尺寸。
对于统计图像峰值的判断,可以采用一阶甚至二阶差分,判断统计图像两侧异号或者突变的点,即元件的边缘位置。
2.1.6手动两点测距
应用最简单方法,测得图像上两点像素的坐标,计算出两点间的像素数,然后根据读取或者测得的图像分辨率计算出任意两点间距离。
2.2设计方案
根据以上设计原理的选择,结合MATLAB的图像处理工具箱函数,大量调用已有函数进行设计,通过各项程序的最优组合,不但完美完成任务,而且使得程序更加优化,运行速度更快。
以下为程序设计选取的重要的程序工具。
2.2.1中值滤波
I=medfilt2(I,[33]);%滤波器的末班为3*3
2.2.2几何校正
cpselect(I,I);%选取控制点
mytform=cp2tform(input_points,base_points,'projective');%建立传输函数
I=imtransform(I,mytform);%对图像反变换
2.2.3截取标定或目标
J=imcrop(I);%从图像上截取需要的标定物或元件图像
2.2.4对比度增强
I=imadjust(I,stretchlim(I));%增强图像对比度
2.2.5二值化
T=graythresh(I);%获取阈值
I=im2bw(I,T);%通过阈值二值化处理
2.2.6获取像素点坐标
[x,y]=ginput
(2);%通过鼠标点击获取像素点坐标
2.2.7距离计算
D=abs(D2-D1)/dpi*2.54;%通过零点或极值点距离获得尺寸
D=sqrt((x
(1)-x
(2))^2+(y
(1)-y
(2))^2)/dpi*2.54;%通过量像素点坐标求得距离
2.3设计流程图
三.课程设计的步骤和结果
3.1图像文件管理
设计的GUI界面如下:
每段程序写在set(handles.edit6,'String','...');与set(handles.edit6,'String','OK');之间,则通过状态窗口程序的执行情况一目了然。
3.1.1打开/拍摄
1.摄像头启动程序
globalvid;
globalP;%标志位
P=8;
axes(handles.axes1);
vid=videoinput('winvideo',1,'YUY2_320x240');
preview(vid);
2.打开/拍摄程序
set(handles.edit6,'String','...');
holdoff;
globaln;n=0;
set(handles.radiobutton1,'value',1);
set(handles.edit1,'String','10');
set(handles.edit3,'String','0');
set(handles.edit4,'String','0');
set(handles.edit5,'String','0');
globalP;
ifP==8
globalvid;
axes(handles.axes1);
I=getsnapshot(vid);
imshow(I);
set(handles.edit7,'String','“摄像头拍摄图像”');
else
[filename,pathname]=uigetfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'打开图像...');
ifisequal(filename,0)|isequal(pathname,0)
errordlg('图像文件未找到','FileError');
else
globalfile;
globalI;
P=1;
file=[pathname,filename];
I=imread(file);
axes(handles.axes1);
imshow(I);
set(handles.edit7,'String','“元件的原始图像”');
end
end
set(handles.edit6,'String','OK');
当标志位P为0时打开图像,P为8是通过摄像头拍摄图像。
打开或拍摄的同时,进行标识为设置和一些现实的清零。
3.1.2复位程序
set(handles.edit6,'String','...');
holdoff;
globalfile;
globalI;
globalP;
globaln;n=0;
set(handles.radiobutton1,'value',1);
set(handles.edit3,'String','0');
set(handles.edit4,'String','0');
set(handles.edit5,'String','0');
ifP==8
axes(handles.axes1);
clareset;
elseifP==0
errordlg('请先打开图像!
','Warning...');
else
P=1;
I=imread(file);
axes(handles.axes1);
imshow(I);
set(handles.edit7,'String','“元件的原始图像”');
end
end
set(handles.edit6,'String','OK');
重新打开未经处理的图像或者关闭拍摄的图像重新拍摄,与打开相似,清空一些数据。
3.1.3存储和关闭
1.存储的程序
set(handles.edit6,'String','...');
globalP;
ifP==0
errordlg('请先打开图像!
','Warning...');
else
[filename,pathname]=uiputfile({'*.jpg';'*.bmp';'*.tif';'*.*'},'保存图片...','Undefined');
if~isequal(filename,0)
str=[pathnamefilename];
px=getframe(handles.axes1);
cdata=getappdata(gcf,'Timg');
imwrite(px.cdata,str);
elseerrordlg('保存失败!
','Warning...');
end;
end
set(handles.edit6,'String','OK');
2.关闭的程序
set(handles.edit6,'String','...');
globalP;
P=0;
set(handles.edit3,'String','0');
set(handles.edit4,'String','0');
set(handles.edit5,'String','0');
axes(handles.axes1);
clareset;
closepreview;
set(handles.edit7,'String','“请先打开图像”');
set(handles.edit6,'String','OK');
通过存储和关闭按键,可以实现对图像的操作,包括对处理到任意状态的图像进行存储或直接关闭。
3.1.4退出
clc;clear;closeall;
close(findobj('Tag','figure1'));
退出程序,关闭所有启动程序,清除数据,关闭运行界面。
3.2图像预处理
3.2.1中值滤波
set(handles.edit6,'String','...');
globalI;
globalP;
switchP
case7,errordlg('图像已经完成二值化,请直接测距或复位!
','Warning...');
case6,errordlg('图像已经增强对比度,请放弃该操作或复位!
','Warning...');
case5,errordlg('已经截取目标,请放弃该操作或复位!
','Warning...');
case4,errordlg('已经选取标定目标,请放弃该操作或复位!
','Warning...');
case3,errordlg('图像已经完成几何校正,请放弃该操作或复位!
','Warning...');
case2,errordlg('图像已经完成中值滤波,请放弃该操作或复位!
','Warning...');
case1,P=2;
I=rgb2gray(I);%转化为灰度
I=medfilt2(I,[33]);%中值滤波
axes(handles.axes1);
imshow(I);
set(handles.edit7,'String','“中值滤波后的元件图像”');
case0,errordlg('请先打开图像!
','Warning...');
end
set(handles.edit6,'String','OK');
通过3*3的模板做中值滤波,原始图像与处理后效果如下图:
3.2.2几何校正
set(handles.edit6,'String','...');
globalI;
globalP;
switchP
case7,errordlg('图像已经完成二值化,请直接测距或复位!
','Warning...');
case6,errordlg('图像已经增强对比度,请放弃该操作或复位!
','Warning...');
case5,errordlg('已经截取目标,请放弃该操作或复位!
','Warning...');
case4,errordlg('已经选取标定目标,请放弃该操作或复位!
','Warning...');
case3,errordlg('图像已经完成几何校正,请放弃该操作或复位!
','Warning...');
case2,P=3;
set(handles.edit7,'String','“选取四对控制点”');
cpselect(I,I);
uiwait;
input_points=evalin('base','input_points');
base_points=evalin('base','base_points');
mytform=cp2tform(input_points,base_points,'projective');
I=imtransform(I,mytform);
axes(handles.axes1);
imshow(I);
set(handles.edit7,'String','“几何校正后的元件图像”');
case1,errordlg('请先进行中值滤波!
','Warning...');
case0,errordlg('请先打开图像!
','Warning...');
end
set(handles.edit6,'String','OK');
通过cpselect(I,I)函数选取四对控制点,采完点后按Ctrl+E把点的数据输出到当前工作空间,通过求得的传输函数逆变换,得到校正后的图像如下:
3.2.3选取标定和截取目标
1.选取标定
globalI;
globalP
switchP
case7,errordlg('图像已经完成二值化,请直接测距或复位!
','Warning...');
case6,errordlg('图像已经增强对比度,请放弃该操作或复位!
','Warning...');
case5,errordlg('已经截取目标,请放弃该操作或复位!
','Warning...');
case4,errordlg('已经选取标定目标,请放弃该操作或复位!
','Warning...');
case3,
B=str2double(get(handles.edit1,'string'));
ifB==0
errordlg('标定长度不能为零,请输入!
','Warning...');
else
P=4;
set(handles.edit7,'String','“请输入标定长度并选取标定目标,右击CropImage”');
J=imcrop(I);%截取标定
J=imadjust(J,stretchlim(J));%增强对比度
T=graythresh(J);%二值化
J=im2bw(J,T);
J=1-J;%反相
[a,b]=size(J);
x=zeros(1,b);
D1=0;D2=0;
fori=1:
a
x=x+J(i,:
);%投影
end
fori=2:
b-1%取水平长度
ifx(i)>1
ifD1==0
D1=i-1;
end
end
ifx(b+1-i)>2
ifD2==0
D2=b+1-i;
end
end
end
end
B=str2double(get(handles.edit1,'string'));
dpi=abs(D2-D1)/B*2.54;
set(handles.edit2,'string',num2str(dpi,'%10.3f'));
case2,errordlg('请先进行几何校正!
','Warning...');
case1,errordlg('请先进行中值滤波!
','Warning...');
case0,errordlg('请先打开图像!
','Warning...');
end
set(handles.edit7,'String','“几何校正后的元件图像”');
set(handles.edit6,'String','OK');
2.截取目标
globalI;
globalP
switchP
case7,errordlg('图像已经完成二值化,请直接测距或复位!
','Warning...');
case6,errordlg('图像已经增强对比度,请放弃该操作或复位!
','Warning...');
case5,errordlg('已经截取目标,请放弃该操作或复位!
','Warning...');
case4,
dpi=str2num(get(handles.edit2,'string'));
ifdpi==0
errordlg('定标未完成,请检查选取的定标点!
','Warning...');
elseP=5;
set(handles.edit7,'String','“请截取元件目标图像,右击CropImage”');
I=imcrop(I);
axes(handles.axes1);
imshow(I);
set(handles.edit7,'String','“截取目标后的元件图像”');
end
case3,errordlg('请先取标定目标!
','Warning...');
case2,errordlg('请先进行几何校正!
','Warning...');
case1,errordlg('请先进行中值滤波!
','Warning...');
case0,errordlg('请先打开图像!
','Warning...');
end
set(handles.edit6,'String','OK');
选取标定即在校正后的图像中选定设置好的标定物,通过对标定物的测量求的像素与实际尺寸的关系,在选取标定之前要先将“标定长度”输入,然后选取图像中标定物,通过增强二值化后,侧得标定物图像的像素数,除以实际尺寸,得到图像的分辨率,自动显示出来。
截取目标是为了去除由于几何校正带来的黑色边框,以便于下一步的处理。
截取标定和目标都是用了I=imcrop(I)函数。
截取过程和截取后元件图像如下图:
3.2.4增强对比度和二值化
1.增强对比度
set(handles.edit6,'String','...');
globalI;
globalP;
switchP
case7,errordlg('图像已经完成二值化,请直接测距或复位!
','Warning...');
case6,errordlg('图像已经增强对比度,请放弃该操作或复位!
','Warning...');
case5,P=6;
I=imadjust(I,stretchlim(I));%增强对比度