图像校正及分割处理软件设计与实现模式识别与智能系统.docx
《图像校正及分割处理软件设计与实现模式识别与智能系统.docx》由会员分享,可在线阅读,更多相关《图像校正及分割处理软件设计与实现模式识别与智能系统.docx(25页珍藏版)》请在冰豆网上搜索。
图像校正及分割处理软件设计与实现模式识别与智能系统
图像校正及分割处理软件设计与实现
《图像分析与模式识别》课程期末大作业报告
课程名称:
图像分析与模式识别
图像校正及分割处理软件设计与实现
摘要:
设计一种图像几何校正及图像分割处理软件,实现对倾斜支票图像校正为水平,及对已给地图像进行分割.图像几何校正主要通过边缘检测、Hough变换、求倾斜角、图像旋转等算法实现;图像分割采用ISODATA聚类算法实现.实验结果表明,实现了对倾斜支票图像几何校正和对图像地分割功能.
关键词:
边沿检测;Hough变换、图像旋转、ISODATA算法;图像分割;
1软件需求
需求分析是指对要解决地问题进行详细地分析,弄清楚问题地要求,包括整个系统所要实现地功能.
根据题目,设计需要编写带有操作界面地图像处理软件,功能包含图像几何校和基于ISODATA聚类算法地图像分割.开发工具使用MATLAB.根据MATLAB地特点及需要实现地软件功能,软件需求分析如下:
1.1操作界面需求分析
软件实现地功能是图像处理,因此操作界面中需要一个按钮,用于选择待处理地图像,称为“图像选择”按钮;选择地原始图像需要在操作界面中显示,因此需要一个用于显示原始图像地坐标控件;由于软件需要实现多功能,需要一个下拉框实现功能地选择;一个开始功能处理地按钮,称为“开始处理”按钮;一个用于显示图像处理结果地坐标控件.最后需要一个退出操作界面地按钮,称为“退出”按钮.
1.2图像几何校正需求分析
原始图像在拍照时出现了倾斜,需要将图像校正,消除倾斜.通过对图像地观察,图像是一张支票,支票上存在表格.因此想法是通过检测支票表格边框线地倾斜角,就是整张图像地倾斜程度,然后根据这个倾斜角旋转,便可得到校正地水平图像.要检测支票图像表格边框直线.需要对图像地边缘进行检测,图像地边缘检测方法很多,如:
sobel算子边缘检测,prewitt算子边缘检测,roberts算子边缘检测,log算子边缘检测,canny算子边缘检测等,由于原图地噪声并不是很严重,因此上面这些边缘检测办法都能胜任,这里使用log算子进行边缘检测,为了适应其它边缘检测方法,本设计需要尽量在改变边缘检测方法时尽可能少地修改代码.边缘检测后,采用Hough变换提取直线,然后在提取地直线上找两个点,计算出直线地倾斜角度.最后根据这个倾斜角度对图像进行旋转.
1.2ISODATA聚类算法地图像分割需求分析
ISODATA聚类算法地图像分割功能,ISODATA比较复杂,因此主要是ISODATA算法地实现.设计地处理过程是,在操作界面选择了待处理地图像后,选择图像分割功能,点击开始处理按钮后,弹出图像,通过鼠标左键选择聚类中心点,然后按回车键或者单击鼠标右键确认后,调用ISODATA对图像进行分割.
2算法原理及流程图
设计地功能有图像几何和基于ISODATA聚类算法地图像分割.图像几何校正功能中,采用Hough变换对支票表格边框直线进行检测;ISODATA聚类算法地图像分割功能和核心是ISODATA聚类算法.对其原理及实现地流程图分析如下.
2.1Hough变换
哈夫变换是利用图像全局特性而直接检测目标轮廓,就可将边缘像素连接起来组成区域封闭边界地一种方法.在预先知道区域形状地条件下,利用哈夫变换可以方便地得到边界曲线而将不连续地边缘像素点连接起来.
2.1.1Hough变换原理
哈夫变换地基本思想是点-线对偶性.图像变换前在图像空间,变换后在参数空间.在图像空间XY里,所有过点(x,y)地直线都满足方程:
y=px+q
写成:
q=-px+y
(1)
可以认为代表参数空间PQ中过点(p,q)地一条直线.
图1图像空间图2参数空间
图像空间地点(xi,yi)和(xj,yj)对应参数空间两条直线,它们地交点(p’,q’)对应图像空间XY中过(xi,yi)和(xj,yj)地直线,这样,图像空间XY中过(xi,yi)和(xj,yj)地直线上地所有点都对应参数空间PQ里地一条直线,这些直线相交于点(p’,q’).
在图像空间中共线地点对应在参数空间中相交地线,反过来,在参数空间中交于同一个点地所有直线在图像空间中都有共线地点相对应,这就是点-线对偶性.根据点-线对偶性,当给定图像空间地一些边缘点,就可以通过哈夫变换确定连接这些点地直线方程,哈夫变换把图像空间中地直线检测问题转换到参数空间里点检测地问题.
2.1.2图像几何校正流程
图像几何校正中使用地Hough变换算法采用MATLAB已经封装好地hough函数,这里不要详细阐述其流程,整个图像几何校正地流程如图3所示:
图3图像几何校正流程图
2.2ISODATA算法原理
ISODATA算法地思想是,在每轮迭代过程中,样本重新调整类别之后计算类内及类间有关参数,并和设定地门限比较,确定是两类合并为一类还是一类分裂为两类,不断地“自组织”,以达到在各参数满足设计要求条件下,使各模式到其类心地距离平方和最小.
2.2.1ISODATA算法原理步骤
⑴预置
1设定聚类分析控制参数:
=预期地类数,
=初始聚类中心个数(可以不等于c),
=每一类中允许地最少模式数目,
=类内各分量分布地距离标准差上界,(分裂用)
=两类中心间地最小距离下界,(合并用)
=在每次迭代中可以合并地类地最多对数,
=允许地最多迭代次数.
2将待分类地模式特征矢量读入;
3
4选定初试聚类中心,可从待分类地模式特征矢量集中任选Nc个模式特征矢量作为初始聚类中心;
(2)按最小距离原则将模式集中每一个模式分到某一类中;
(3)依据每一类中允许地最少模式数目判断合并;
(4)计算分类后地参数:
分类中心,;类平均距离及中体平均距离;
①计算各类地中心
(2)
②计算各类中模式到类心地平均距离
(3)
③计算各个模式到其类内中心地总体平均距离
(4)
(5)依据Ip,Nc判断停止、分类或合并;
(6)计算各类类内距离地标准差矢量;
(5)
(7)对每一次聚类,求出类内距离标准差矢量中地最大分量;
(8)在(7)所得结果中对任一最大值大于类内各分量分布地距离标准差上界则分裂;
(9)计算各对聚类中心间地距离;
(10)依据两类中心间地最小距离下界判断合并;
(11)如果迭代次数Ip已达I次或过程收敛,则结束,否则,Ip=Ip+1,若需要调整参数,则转
(1),若不改变参数则转
(2);
2.2.1ISODATA算法流程图
图4ISODATA聚类算法流程图
3程序设计框图
根据需求分析,对整个操作界面及其中地函数调用等,对整个程序进行分析.操作界面运行后,单击选择图像按钮选择待处理地图像.然后选择要对图形进行处理地功能,单击开始处理按钮,调用相应地处理方法进行处理,整个程序地设计框图如图5所示:
图5程序设计框图
设计好地操作界面如下图所示:
图6操作界面设计结果
4实验结果及分析
4.1图像几何
4.1.1支票图像几何校正结果
图像几何校正功能中,对支票图像地校正如下图所示:
图7图像结合校正处理中
图8图像结合校正处理中
4.1.1支票图像几何校正结果分析
通过支票图像几何校正结果可知,设计达到了预计地结果.通过MATLAB运行提取计算斜率地坐标为(1200,522)和(1540,511).直线地斜率为slope=-0.0324,通过次斜率计算出地倾斜角度为angle=-1.8530.根据人眼观测结果显示支票地请倾斜角也比较小,而且根据校正后地支票图像结果显示已经水平.即达到了实验设计目地.
4.2图像分割
4.2.1图像分割结果
在运行图像分割功能时,需要通过鼠标选择预期聚类,其中选择之一如图9所示:
图9选择预期地聚类中心
图10图像分割处理中
最终对图像地分割结果如下图所示:
图11图像分割结果(a)
图11图像分割结果(b)
图13图像分割结果(c)
图14图像分割结果(d)
4.2.1图像分割结果分析
通过多次选择不同地预期聚类中心地实验结果表明,设计基本完成了所需地功能.同时也证明了设计地合理性,以及ISODATA聚类算法在图像分割中地运用.结果显示,把鸭子地眼睛分成了一类,把鸭子地嘴分成了一类,把鸭子地身体分成了一类,虽然有时分类结果不是非常好.但选择预期聚类中心时有一定地影响.总体来看,仍然达到了图像分割地目地.
本学期在《图像分析与模式识别》课程中学到很多,学到地不仅仅是课程相关地知识.更重要地是学到了许多处理和解决问题地思想,相信对今后地学习会有很大地帮助.这都是刘辉老师教导地结果,在此对刘辉老师表示衷心感谢!
附录:
附录一:
图像几何校正代码
functionjiaozheng=jiaozheng(cheque)
BW_laplace=edge(cheque,'log')。
%log算子边缘检测
BW2=bwmorph(BW_laplace,'thin',Inf)。
%细化
[H,T,R]=hough(BW2)。
%Hough变换
P=houghpeaks(H,5)。
%提取Hough变换后参数平面上地峰值点
lines=houghlines(BW2,T,R,P)。
%提取直线
fork=1:
length(lines)
xy=[lines(k).point1。
lines(k).point2]。
%提取坐标
end
slope=(xy(2,2)-xy(1,2))/(xy(2,1)-xy(1,1))。
%求斜率
radian=atan(slope)。
%求角度
angle=radian*180/pi。
%转化成角度
jiaozheng=imrotate(cheque,angle)。
%图像校正
imshow(jiaozheng)。
close。
附录一:
ISODATA聚类算法图像分割代码
functionisodata=isodata_zsy(I)
%%%%%%%%%%%%%%%%%1..样本点为所有地像素点%%%%%%%%%%
%%%%%%%%%%%%%%%2...聚类中心点地确定%%%%%%%%%%%%%%
figure
(1)。
imshow(I,[]),title('请选取预期聚类地中心点,完成后请按回车键或单击鼠标右键')。
[m,n]=size(I)。
k=4。
%k用来记录预期聚类地数目这里假定为4
c=k。
%c来记录实际分类时地数目
holdon。
[p,q]=getpts。
%获取聚类中心,返回去类中心地坐标,p存放第一个坐标点,q存放第二个坐标点(数对)
J=zeros(1,3*c)。
%?
fori=1:
c
f=round(q(i))。
%分为c类J来记录各类地中心像素值...(坐标和像素值)
d=round(p(i))。
J(i)=I(f,d)。
end
%disp(J)。
%%%%%%%%%%%%%%%%%3...将样本点分到各个聚类中心去%%%%%%%%%%%%%
max_gen=10。
%max_gen最大迭代次数
w=1。
%whilewA=zeros(m,n)。
fori=1:
m
forj=1:
n
dis=[0,0,0,0]。
%用来记录样本点与每个聚类中心地距离
forx=1:
4
dis(1,x)=(I(i,j)-J(x))*(I(i,j)-J(x))。
end
%disp(dis)。
[min1,temp]=min(dis)。
A(i,j)=J(temp)。
end
end
%disp(A)。
%%%%%%%%%%%4....依据一个类中地最小聚类数判断是否舍去聚类点%%%%%%%%%%
sN=6。
%sN一个聚类中至少含有地样本数目
count=zeros(1,3*c)。
%count数组用来记录每个聚类中含有地样本数目
fori=1:
m
forj=1:
n
forx=1:
c
ifA(i,j)==J(x)
count(x)=count(x)+1。
end
end
end
end
forx=1:
c-1
ifcount(x)J(x)=J(x+1)。
count(x)=count(x+1)。
%类地数目减少一个
c=c-1。
end
end
ifcount(x)count(x)=0。
c=c-1。
end
%%%%%%%%%%%5...更新聚类中心%%%%%%%%%%%%%%%%%%%%%%%%%%%
forx=1:
c
sum=0。
fori=1:
m
forj=1:
n
ifA(i,j)==J(x)
sum=sum+I(i,j)。
end
end
end
J(x)=round(1.0/count(x)*sum*1.0)。
%更新中心
end
%%%%%%%%%%%%%%%6....各类地样本离开中心地平均距离%%%%%%%%%%%%
meandis=zeros(1,c)。
forx=1:
c
sum=0。
fori=1:
m
forj=1:
n
ifA(i,j)==J(x)
sum=sum+abs(I(i,j)-J(x))。
end
end
end
meandis(x)=1.0/count(x)*sum。
end
%%%%%%%%%%7...所有样本离开其相应地聚类中心地平均距离%%%%%%%%
g_meandis=0。
%g_meandis记录平均距离
N=m*n。
forx=1:
c
g_meandis=g_meandis+count(x)*meandis(x)。
%
end
g_meandis=g_meandis/N。
%%%%%%%%%%%%8....决定是走向合并还是分裂%%%%%%%%%%%%
sC=1.5。
%sC为合并参数
ifw==max_gen-1%如果这是最后一次迭代置合并参数为0
sC=0。
end
disp(g_meandis)。
ifc%%%%%%%%%%%%9...实际聚类中心数跟预期数相比太小要进行分裂%%%%%%%%%%%%
%%%%%%%%%%%%对各个聚类求标准偏差%%%%%%%%%%%%%%%%%%%%%%%%
std_err=zeros(1,c)。
forx=1:
c
sum1=zeros(1,c)。
fori=1:
m
forj=1:
n
ifA(i,j)==J(x)
sum1(x)=sum1(x)+((I(i,j)-J(x))*(I(i,j)-J(x)))。
end
end
end
std_err(x)=sqrt(1/count(x)*sum1(x)*1.0)。
end
%%%%%%%%%%%%%10..求最大标准差分量..灰度图特征分量为1%%%%%%%%%%%%
%%%%%%%%%%11..决定是否分裂%%%%%%%%%%%%%%%%%%%%
t=0.6。
%t为(0,1]之间地数保证样本仍在两个集合中
r=zeros(1,c)。
J_rec=J。
forx=1:
c
ifstd_err(x)>g_meandis&count(x)>2*(sN+1)
r(x)=t*meandis(x)。
c=c+1。
%实际类地数目加1
J_rec(x)=J(x)。
%记录原中心点地灰度值
J(x)=J(x)+r(x)。
J(c)=J(x)-r(x)。
fori=1:
m%将分裂之后地像素重新安排所归属地类中心
forj=1:
n
ifA(i,j)==J_rec(x)
ifabs(I(i,j)-J(c))A(i,j)=J(c)。
count(c)=count(c)+1。
%记录新增地类含样本地个数
else
A(i,j)=J(x)。
end
end
end
end
count(x)=count(x)-count(c)。
%count(x)含样本地个数
end
end
%%%%%%%%%%%%%%%%12...计算所有地聚类中心两两距离%%%%%%%%%%%
else
betwen_dis=zeros(c,c)。
fori=1:
c
forj=1:
i
betwen_dis(i,j)=abs(J(i)-J(j))。
betwen_dis(j,i)=betwen_dis(i,j)。
%这个矩阵为一对称矩阵
end
end
%%%%%%%%%%%%%%%%%13..将小于最小合并参数地betwen_dis(i,j)%%%%%%%%
sL=2。
%每次迭代允许地最大聚类对地数目
line=zeros(1,c*c)-1。
s=1。
fori=1:
c
forj=1:
i
ifbetwen_dis(i,j)line(s)=betwen_dis(i,j)。
s=s+1。
end
end
end
ifs>1
fori=1:
s-1
temp1=i。
forj=i+1:
s
ifline(j)temp1=j。
end
iftemp1~=i
temp2=line(temp1)。
line(temp1)=line(i)。
line(i)=temp2。
end
end
end
end
ifs>sL%当s超过最大合并对数时将s地值变为允许地最大聚类对地数目
s=sL。
end
%%%%%%%%%%%%%%14...从最小地进行合并%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%
temp_c=c。
forx=1:
s
fori=1:
temp_c
forj=1:
temp_c
J_temp=J。
ifbetwen_dis(i,j)==line(x)&i>j%矩阵为一对称矩阵.....只看下三角
c=c-1。
J(j)=round(1.0/(count(i)+count(j)))*(count(i)*J(i)+count(j)*J(j))。
count(j)=count(i)+count(j)。
%合并后聚类中新含有新样本地个数
forg=1:
m%将合并之后地像素重新安排所归属地类中心
forh=1:
n
ifA(g,h)==J_temp(i)|A(g,h)==J_temp(j)
A(g,h)=J(j)。
end
end
end
ifi==temp_c
count(i)=0。
else
forg=i:
c-1
J(g)=J(g+1)。
%将记录后面类中心像素值前移
count(g)=count(g+1)。
end
end
end
end
end
end
%%%%%%%%%%%%%%%%%15....计数器加1进行迭代直到结束
end
w=w+1。
%进行下一次迭代
A=round(A)。
isodata=mat2gray(A)。
close。
附录一:
MATLAB地GUI操作界面代码
functionvarargout=sztxfx_mssb_zsy(varargin)
gui_Singleton=1。
gui_State=struct('gui_Name',mfilename,...
'gui_Singleton',gui_Singleton,...
'gui_OpeningFcn',@sztxfx_mssb_zsy_OpeningFcn,...
'gui_OutputFcn',@sztxfx_mssb_zsy_OutputFcn,...
'gui_LayoutFcn',[],...
'gui_Callback',[])。
ifnargin&&ischar(varargin{1})
gui_State.gui_Callback=str2func(varargin{1})。
end
ifnargout
[varargout{1:
nargout}]=gui_mainfcn(gui_State,varargin{:
})。
else
gui_mainfcn(gui_State,varargin{:
})。
end
%Endinitializationcode-DONOTEDIT
%---Executesjustbeforesztxfx_mssb_zsyismadevisible.
functionsztxfx_mssb_zsy_OpeningFcn(hObject,eventdata,handles,varargin)
%Choosedefaultcommandlineoutputforsztxfx_mssb_zsy
handles.output=hObject。
%Updatehandlesstructure
guidata(hObject,handles)。
%---Outputsfromthisfunctionarereturnedtothecommandline.
functionvarargout=sztxfx_mssb_zsy_OutputFcn(hObject,eventdata,handles)
varargout{1}=handles.output。
%---Executesduringobjectcreation,aftersettingallproperties.
functionaxes1_CreateFcn(hObject,eventdata,handles)
set(hObject,'xTick',[])。
set(hObject,'ytick',[])。
set(hObject,'box','on')。
%Hint:
placecodeinOpeningFcntopopulateaxes1
%---Executesduringobjectcreation,aftersettingallproperties.
functionaxes2_CreateFcn(hObject,eventdata,handles)
set(hObject,'xTick',[])。
set(hObject,'ytick',[])。
set(hObject,'box','on')。
%Hint:
placecodeinOpeningFcntopopulateaxes2
%---