基于MATLAB GUI的红外图像坏元检测软件
2018-08-30夏小华
阳 平,夏小华
(92941部队43分队, 辽宁 葫芦岛 125001)
红外热像仪在使用过程中,不可避免地会出现坏元。坏元在红外图像中表现为过亮或者过暗的点[1,2]。坏元的存在不仅影响红外热像仪的成像效果[3],对于军事上探测用的红外热像仪,还可能影响设备性能和作战使用[4]。如何快速、简便地实现坏元检测,就显得尤为重要。MATLAB具有强大的数值计算[5,6]和图像处理[7]功能,其自带的图形用户界面(GUI)工具箱可用以开发可视化界面,在该界面通过调用MATLAB强大的数值计算功能,可以方便地完成特定操作[8]。本研究基于MATLAB GUI开发了红外图像坏元检测软件,界面直观,操作方便,可为红外热像仪的日常使用和维护提供便利。
1 坏元检测原理
坏元红外图像的特征是和周围正常像元在灰度上有明显的差异[9]。因此,首先查找局部区域灰度突出的像元。以5×5大小的窗口对所有焦平面像元逐一检测[10]。通过比较像元与窗口内平均灰度水平的差异进行坏元检测,判别准则为
(1)
综上,坏元检测流程如图2所示。
2 坏元检测软件设计
2.1 软件主要功能和软件界面布局
1) 绘制红外图像的灰度直方图;
2) 检测红外图像中的坏元;
3) 给出坏元的数量和位置信息;
4) 将检测出的坏元在图像中标记显示。
根据软件的功能,设计软件结构如图3所示。
使用MATLAB GUIDE界面进行软件设计。根据软件的功能需求,设计了菜单和功能模块两种操作方式。功能模块用到的组件有Axes(坐标轴),Push Button(按钮),Edit Text(可编辑文本)和Table(表格)。具体功能为:4个Axes,分别用于显示红外图像原图、灰度直方图、坏元检测进度和对坏元进行标记;4个Push Button分别实现红外图像的读入、绘制灰度直方图、坏元检测和关闭软件;1个Edit Text用于显示坏元数量;1个Table用于显示坏元的位置信息。对于每个组件,可以双击后在弹出的属性框里修改属性,为方便程序编写,一般需要修改标签(Tag)。
2.2 主要模块设计
在GUIDE界面布置完各个组件后,开始编写各个组件的回调函数。
1) 红外图像读入与处理模块
在MATLAB中,使用imread函数读入图片,其格式为:imread(fpath),fpath为图片完整的路径。使用imshow函数显示图片,其格式为imshow(I),I为待显示的图片。编写红外图像的读取和显示的回调函数,如下:
function m_file_open_Callback(hObject,eventdata,handles)
[FileName,PathName]= uigetfile({′*.bmp;*.jpg;*.png;*.jpeg′,′Image Files (*.bmp,*.jpg,*.png,*.jpeg)′;′*.*′,′All Files (*.*)′},′读入红外图像′); %读入图片格式的红外图像文件
if isequal(FileName,0) || isequal(PathName,0)
return; %无操作
end
global img_origin
axes(handles.axes_origin); %设定当前操作的坐标轴是axes_origin
fpath=[PathName FileName]; %将文件名和目录名组合成一个完整的路径
img_origin=imread(fpath); %读入图片
imshow(img_origin)
由于读入的红外图像在其他回调函数中也会用到,因此用global命令将img_origin定义成全局变量。在每个用到img_origin的回调函数中,都要用global重新定义一遍。
使用imhist函数绘制图像的灰度直方图,格式为imhist(img_origin)。
2) 坏元检测与标记模块
首先,定义坏元的统计量。
I=img_origin;
I=double(I); %将红外图像转换成双精度数据
BadNum=0; %统计坏元个数;
BadLoc=zeros(size(I)); %统计坏元位置
BadRow=zeros(1000,1); %坏元所在行
BadCol=zeros(1,1000); %统计所在列
检测完毕后,Edit Text用于显示坏元数量,实现代码如下:
set(handles.valdsp_result,′string′,[′坏元数量:′,num2str(BadNum),′个′]);
同时,将坏元的位置信息在表格中显示,其代码如下:
uitable(handles.uitable_result);
tblist=[(1:BadNum)′,BadLoc(1:BadNum)′,BadRow(1:BadNum),BadCol(1:BadNum)′];
set(handles.uitable_result,′Data′,tblist);
在图像上对坏元进行标记,其代码如下:
axes(handles.axes_result)
imshow(img_origin)
hold on
for t=1:BadNum
plot(BadCol(t),BadRow(t),′ow′) %在图像中,对坏元的位置进行标记
end
坏元检测软件的M文件编写完毕后,使用mcc命令对GUI的m文件进行编译,生成.exe可执行文件。但是该可执行文件需要MATLAB环境的支持。为了能在没有安装MATLAB的计算机上运行,还需要打包MATLAB组件运行环境(Matlab Component Runtime,MCR)[11]。在MATLAB命令窗口输入deploytool命令并运行,弹出“MATLAB Compliler”窗口,点击“Application Compiler”按钮,即进入Deployment主窗口,添加待打包的M文件,并勾选“Runtime included in package”,点击Package,即完成了软件打包。打包生成的可执行文件可脱离MATLAB环境运行。
3 坏元检测软件应用
软件用户界面如图4所示。软件设计了菜单栏、图像/表格显示区和功能操作区三个功能区域。
进入软件后,点击读入红外图像按钮,从计算机存储设备选择待检测的红外图像,选择完成后,原始图像下方会显示红外原图。点击灰度直方图按钮,生成和显示图像的灰度直方图。点击坏元检测按钮,开始检测坏元,进度条上实时显示检测进度。检测完成后,会给出坏元数量、位置信息,并在坏元检测结果图上对坏元进行标记显示。
图5是软件对某红外图像的坏元检测结果。
软件运行结果直观显示了图像中的坏元,并且给出了坏元的数量和精确位置。应用结果表明,软件对不同类型的坏元都能够有效识别,取得了很好的检测效果。
4 结论
采用Matlab GUI工具箱对坏元检测方法进行了可视化软件设计。软件可绘制红外图像的直方图、检测图像中的坏元、获取坏元的位置信息并将坏元在图像中标记显示。软件操作直观简便,测试结果表明,该软件可实现坏元的快速准确定位,具有很强的应用价值。