实验名称:条纹图像的特征检测方法与程序设计 课 程:图像检测与处理 专 业:测控技术与仪器 实验日期:2015年12月4日
1、实验目的
通过图像处理算法的设计和程序编写调试,掌握采用数字图像处理技术实现工业目标对象特征检测的基本方法和过程。 2、实验原理
在相对亮的背景下,对较暗的目标对象(线缆)进行检测,得到有一定对比度的数字图像。首先,根据所采集的图像质量判断是否需要进行图像增强,根据图像增强原理分析和实验结果选用增强算法;为检测线缆的直径尺寸,方法之一是用行方向上线缆所覆盖的像素数来描述线径,为实现线缆覆盖像素数的度量,需要先将线缆目标从背景中分离出来,即进行二值化处理,选择二值化处理算法和门限值,对增强后的灰度图像进行二值化处理;然后,统计各个像素行线缆直径方向上所覆盖的像素数N,对各行覆盖像素数求平均,作为检测结果值(单位:像素)。
在检测系统的成像放大率不变的情况下,通过数字图像像素当量(毫米/像素)的标定,即对每个像素代表的实物尺寸的测定,则可以得到线径的实际尺寸:
3、实验指标及要求
自行设计图像处理程序和算法,实现给定条纹图像中的条纹中心线和条纹宽度的检测,并以像素为单位给出宽度检测结果。 4、实验设备
PC计算机,MATLAB程序开发软件,PHOTOSHOP图像处理软件,被处理的数字图像文件等。
5、实验及结果分析
(1)叙述实验设计过程中需要考虑的图像处理步骤;
解:读取待处理图像;对图像进行中值滤波处理;采用最大类间方差法选取一个合理的二值化分割阈值;按照阈值进行二值化处理;闭运算处理;统计每一行含有目标对象的像素数目,并出其平均值,得到以像素为单位的条纹宽度检测结果;找到目标图像每一行的中心位置,将其连接起来,即得到了条纹中心线。
(2)简述在所设计的程序实现中所采用的图像处理算法及依据;
解:中值滤波:消除图像中含有的噪声点,对噪声信号进行了有效的抑制;
最大类间方差法:方差是表征数据分布不均衡性的统计量,通过阈值对目标和背景进行了分割,通过循环使得两类数据间的方差越大越好,把该结果对应的阈值作为最佳阈值;
二值化处理:通过二值化处理,使图像的像素只有0和1,便于后续的处理;
闭运算:选取了一个结构元素,进行闭运算处理,目的是填充目标内小空洞、连接断开的近邻目标、平滑边界;
宽度检测:统计每行含有目标对象的像素数目,并求出其平均值,即得到了以像素为单位的条纹宽度检测结果;
条纹中心线:找到目标图像中每一行的中心位置,将其连接起来,即得到了条纹中心线。 (3)写出提取图像中条纹中心线检测的程序流程和程序代码; 解:条纹中心线检测的程序代码:
% --- Executes on button press in pushbutton5.
function pushbutton5_Callback(hObject, eventdata, handles) aa=handles.aa; [m,n]=size(aa);
for i=1:m %逐行扫描 z0=find(aa(i,:)==0); k=length(z0);
fz(i)=z0(1); %找出目标对象每行的第一个元素的坐标 lz(i)=z0(k); %找出目标对象每行的最后一个元素的坐标 y=round((lz+fz)/2); %求每行第一个和最后一个元素坐标平均值,即得到每行的中心位置 end x=1:m;
plot(y,x,'r','LineWidth',1) %画出中心线 axes(handles.axes3);
图1:条纹中心线检测的程序流程图 图2:条纹宽度的程序流程图 (4)写出检测图像中条纹宽度的程序流程和程序代码; 解:条纹宽度的程序代码
% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles) aa=handles.aa;
one_count=sum(aa,2); %统计图像背景中每行所包含的像素数目
zero_count=size(aa,2)-one_count; %计算统计出目标图像中每行所包含的像素数目 handles.zero=zero_count;
dia=mean(zero_count); %计算像素平均值,得到以像素为单位的条纹宽度检测结果 dstr=['检测结果:' num2str(dia) ' pixels']; %将检测结果在GUI中显示出来
set(handles.text3,'String',dstr); guidata(hObject, handles);
(5)给出以像素为单位的条纹宽度检测结果,用不同的颜色标记出条纹中心线。(见图3)
图3:检测结果及中心线
6、实验总结与体会
(1)分析总结实现工业目标对象特征检测的基本图像处理环节;
解:首先,读取观察图像,判断图像的质量;然后,在对图像滤波处理和图像增强,使图像噪声得到抑制,对比度增强;选取合适的方法,进行二值化处理;去除伪目标,通过贴标签的方法区分不同的目标对象;最后,对目标对象进行检测处理,获取我们想要的特征。 (2)分析并提出提高条纹宽度检测精度的方法(至少一种方法);
解:①图像进行锐化处理,使目标图像的边界信息突出,避免其在滤波时损失部分信息
②采用区域提取的方法,将研究的目标图像从图像中分割出来,进行宽度检测,这样就会避免对不是目标对象的像素点进行统计了,提高了检测的精度。 (3)分析并绘出工业图像检测应用系统的基本组成系统框图。(见图4)
图4:工业图像检测应用系统基本组成
7、参考文献
[1] 章毓晋编著.图象分析与处理.北京:清华大学出版社,1999年
[2] 何锦平.基于小波分辨的图像增强及其应用研究[D].西北工业大学硕士学位论文,2003.4 [3] 孔祥刚,诸静.基于PCI总线和DSP芯片的图像处理平台的硬件设计[J].电子技术应用,
2003(12):70~73
[4] 孙小鹏,孔玲君.基于图像处理的数字印刷线条质量检测方法研究[J].包装工程,2013年
7期 [5] 闫敬文,《数字图像处理MATLAB版》,国防工业出版社,2007.2 8、程序代码及程序流程图
function varargout = exp5(varargin) gui_Singleton = 1;
gui_State = struct('gui_Name', m, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @exp5_OpeningFcn, ... 'gui_OutputFcn', @exp5_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1}); end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else
gui_mainfcn(gui_State, varargin{:}); end
function exp5_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; guidata(hObject, handles);
function varargout = exp5_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output;
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles) a=imread('line2.bmp'); axes(handles.axes1); imshow(a); handles.a=a;
guidata(hObject, handles);
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles) a=handles.a; a=a(:,:,1); J=medfilt2(a);
axes(handles.axes2); imshow(J);
handles.J=J;
guidata(hObject, handles);
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles) J=handles.J;
bw=im2bw(J,graythresh(J)); bw=bwareaopen(bw,100); axes(handles.axes3); imshow(bw);
se=strel('square',10); aa=imclose(bw,se); imshow(aa); hold on
handles.aa=aa;
guidata(hObject, handles);
% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles) aa=handles.aa;
one_count=sum(aa,2);
zero_count=size(aa,2)-one_count; handles.zero=zero_count; dia=mean(zero_count);
dstr=['检测结果:' num2str(dia) ' pixels']; set(handles.text3,'String',dstr); guidata(hObject, handles);
% --- Executes on button press in pushbutton5.
function pushbutton5_Callback(hObject, eventdata, handles) aa=handles.aa; [m,n]=size(aa); for i=1:m
z0=find(aa(i,:)==0); k=length(z0); fz(i)=z0(1); lz(i)=z0(k);
y=round((lz+fz)/2); end x=1:m;
plot(y,x,'r','LineWidth',1) axes(handles.axes3);
% --- Executes on button press in pushbutton6.
function pushbutton6_Callback(hObject, eventdata, handles) close;
图5:程序流程图
因篇幅问题不能全部显示,请点此查看更多更全内容