1 简介
第一步:靶图像预处理
通过采集系统我们得到射击后的靶图像,即:模拟图像。还必须将模拟图像转化为数字图像,然后进行一系列的图像预处理,图像预处理是进行的各种图像校正、图像滤波除噪声等处理环节。
报靶系统采用的图像格式这里为JPG格式,之后转化成灰度图象。
(1)图像滤波,初步消除噪声
本系统采用二维中值滤波,中值滤波的主要功能就是让与周围像素灰度值的差比较大的像素改取与周围像素接近的值,从而可以消除孤立的噪声点,由于不是简单的取均值,产生的模糊比较少。中值滤波对于消除孤立点和线段的干扰将十分有用。
(2)图像减影,初步把弹孔分割
将前后捕获到的两幅靶图像对应坐标的像素灰度值相减,得到的各点灰度差值组成新的结果图像。两个原图像中的所有相同背景由于灰度值相同,相减结果为0,在这个结果图像里面就是统一的暗区域。而结果图像中的亮区域是射击在后靶图像上造成的新弹点和前靶图像上没有弹点的对应区域灰度值相减形成的。这个亮区域就是我们要提取的对象物,它代表一个新的弹点。减影处理还有一个好处是:排除掉了新的靶图像中那些原先已经存在的旧弹点对弹点识别的干扰。
(3) 靶图像二值化,完成弹孔的分割与检测
选取一个合适的阈值进行二值化,来将弹点分割出来,使图像二值化后能较完整地保持弹点的几何形状,以便能将对弹点的识别精度提到最高
(4)弹孔的噪声滤除
这一步操作是为了消除弹孔周围的裂缝,同时减影操作也会对弹孔增加一些噪声点,如果不加处理直接进行弹点坐标提取则可能会误判(丢失或增加)一些弹点象素,使判靶精度受到影响。为保证获得完整准确的弹点图像还必须对减影图进一步除噪处理。方法是用数学形态学中的腐蚀、膨胀算法。
先用闭合操作,填平轮廓的缺口,即对二值化后的图像进行膨胀操作后再用腐蚀复原。再开操作,也可去除轮廓上突出的毛刺,即对二值化后的图像进行腐蚀操作后再用膨胀复原。
(5)图像目标矫正。
经过上述的操作,我们得到的靶图像是存在畸变的,减影后二值化的图像的畸变还
没有恢复,为了准确提取弹孔坐标,必须对其进行校正。
射击过程中靶图像出现几何失真的类型主要为:倾斜投影畸变。用来采集靶图像的摄像头所处的位置使摄像头不可能和靶平面保持绝对垂直的投影关系,摄像头以一定的倾斜角度拍摄到的靶图像就会不可避免的出现畸变。
一般用坐标变换的几何矫正方法。二次影射变换式来进行几何校正。该式如下:
决定坐标变换式的关键是其中系数的确定。为了确定系数,必须知道所给定靶图像上的观测基准点应该在无畸变坐标系的什么地方,畸变的靶图像和无畸变靶图像中选择4对基准点与其对应,对最佳基准点的选择我们采用最小二乘法可以求出。由于时间原因,我们用的图像都是已经矫正过的。
第二步,弹孔识别
弹点识别的任务就是将数组内存放的干扰区域排除,将真实的弹孔区域识别出来。这里用基于模板匹配方法的基本原理,事先求出标准弹点和干扰点的特征向量,然后和每一个未知点的特征向量比较,最接近标准差的就是弹点。由于二值化后的特征点比较简单,而且实际采样没有太大的变形,特征向量也比较稳定,所以该方法适合弹点的识别。
第三步,弹点环值判定
判定弹点环值实质是判定弹点在胸环靶中所处的区域,知道每个区域所对应的环数也就知道了该区域内弹点的环值。
(1) 靶心与圆的半径计算
首先要确定靶心坐标和各圆环半径。这里用Hough变换。Hough变换可应用于检测图像空间的解析曲线,
求圆心步骤:①对标准胸环靶二值化②基于Hough法检测圆心坐标X(a,b),同时检测到每个相邻靶环的间隔距离r。
(2) 弹点环值判定
在第二步中弹点的坐标确定了,设为D(x0,y0),求出弹点距圆心的距离d,弹点的环值为:
由于军用靶只有五个环,故或者写个5次循环的代码,就很好计算出环值,具体见程序中。
由于时间原因,只实现了简单的报靶系统,系统中假设图像已经做了矫正。
2 部分代码
function varargout = shoot_system(varargin)% SHOOT_SYSTEM M-file for shoot_system.fig
%军用报靶系统主函数1
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @shoot_system_OpeningFcn, ...
'gui_OutputFcn', @shoot_system_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 shoot_system_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
% ---输出返回到命令行.
function varargout = shoot_system_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
% --- 载入图像,这张靶图像没有弹点痕迹
function pushbutton1_Callback(hObject, eventdata, handles)
if(distance-i*lamda>0)
continue;
else
ba=10-i+1;
break;
end
end
all_ba(j)=ba;
end
result=num2str(all_ba);
set(handles.edit1,'string',result);
function edit1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% 关闭系统
function pushbutton6_Callback(hObject, eventdata, handles)
close(gcf);
3 仿真结果
4 参考文献
[1]袁莉茹. 基于图像处理的军用自动报靶系统弹孔识别[D]. 重庆大学.