您的位置:首页 > 编程语言 > MATLAB

如何用Matlab将web上的迷宫图缩小(线宽为1px)

2014-05-05 17:52 295 查看

例图:



整个处理过程分为5步

第一步、

%函数目的
%1、导入图像,对图像进行灰度处理,转化成只有0和255两种数值
%2、
function [GI,NumBlackLine]=step1()
H=imread('test.png');
GI=rgb2gray(H);
GI(GI<50)=0;
GI(GI>=50)=255;
imshow(GI);
pause;
IHlength=size(GI,1);
IWlength=size(GI,2);
i=1;
Numdel=0;
t=1;
while i<=IHlength
%一行像素点,如果小于整个行的10%表明这个行就是空白的“可行路”而非“黑线”
if size(find(GI(i,:)==0),2)<(0.4*IWlength)&&size(find(GI(i,:)==0),2)>(0.1*IWlength)
Numdel=[Numdel,i];
end
%如果这一行像素点大于整个行的40%表明这个行就是黑线
if size(find(GI(i,:)==0),2)>(0.4*IWlength)
%第一个 满足条件的!上一行!
x=i;
Numblack=0;
while size(find(GI(i,:)==0),2)>(0.4*IWlength)
%黑色点较多行,的每一行的黑色点数
Numblack(i)=size(find(GI(i,:)==0),2);
%最后一个,黑色较多行的 !下一行!
i=i+1;
end
Temp=find(Numblack==max(Numblack));
%使最大的元素只有一个
Numblack(Temp(1))=Numblack(Temp(1))+1;
Numdel=[Numdel,find(Numblack<max(Numblack)&Numblack>0),x-1,i];
%其实并不需要但是为了严谨
i=i-1;
end
i=i+1;
end
%删除多余的黑线
Numdel(1)=[];
GI(Numdel,:)=[];

%matlab精简矩阵
%求精简后矩阵中“黑色行像素”的位置
IHlength=size(GI,1);
IWlength=size(GI,2);
i=1;
while i<IHlength
if size(find(GI(i,:)==0),2)>(0.4*IWlength)
NumBlackLine(t)=i;
t=t+1;
end
i=i+1;
end
end

处理结果:





第二步、

%如何处理列变成一个像素宽度,
%先大致加强黑色宽度,然后再变细
function [GI,NumBlackBlock]=step2(GI,NumBlackLine)
IHlength=size(GI,1);
IWlength=size(GI,2);
%宽度
rows=size(NumBlackLine,2);
i=1;
%用来存放每一列有几个黑色的块段
NumBlackBlock(IWlength)=0;
%先循环行
for j=1:(rows-1)
i=1;
temp=0;
t=1;
%列的一小段间隔内黑点的数目
%列的第i列,它的第NumBlackLine(j)行到第NumBlackLine(j+1)行内的黑色点数目
a=NumBlackLine(j);
b=NumBlackLine(j+1);
while i<=IWlength
ColNumBlack=size(find(GI(a:b,i)==0),1);
%一行之间黑色的块段内,黑色像素点数目的个数
if ColNumBlack>(0.3*(b-a))
%存放哪一列需要加强
temp(t)=i;
t=t+1;
end
i=i+1;
end
tempsize=size(temp,2);
%为保持精度,将特定的行的左右邻行都加强。
for k=1:tempsize
i=temp(k);
GI(a:b,i-1)=0;
if (k==1)||(temp(k-1)~=(i-1))
NumBlackBlock(i-1)=NumBlackBlock(i-1)+1;
end
GI(a:b,i)=0;
NumBlackBlock(i)=NumBlackBlock(i)+1;
GI(a:b,i+1)=0;
if (k==tempsize)||(temp(k+1)~=(i+1))
NumBlackBlock(i+1)=NumBlackBlock(i+1)+1;
end
end
end
end

处理结果:



第三步、

function [GI]=step3(GI,NumBlackBlock)
IHlength=size(NumBlackBlock,2);
NumColDel=0;
i=1;
while i<=IHlength
NumColD=0;
if NumBlackBlock(i)>0
while NumBlackBlock(i)>0
NumColD(i)=NumBlackBlock(i);
i=i+1;
end
Temp=find(NumColD==max(NumColD));
NumColD(Temp(1))=NumColD(Temp(1))+1;
NumColDel=[NumColDel,find(NumColD<max(NumColD)&NumColD>0)];
i=i-1;
end
i=i+1;
end
NumColDel(1)=[];
GI(:,NumColDel)=[];
end

处理结果:



第四步、

function [GI,Returnj]=step4(GI);
IHlength=size(GI,1);
IWlength=size(GI,2);
tempj(1,1:IWlength)=0;
j=1;
nj=1;
Returnj=0;

while j<=IHlength
t=1;
if min(GI(j,:)==tempj)
while min(GI(j,:)==tempj)
t=t+1;
j=j+1;
if j>IHlength
j=j-1;
Returnj(nj)=j;
nj=nj+1;
return;
end
end
j=j-1;
else

Returnj(nj)=j;
nj=nj+1;
tempj=GI(j,:);
end
j=j+1;
end
end


处理结果:



第五步、

function [GI,Returni]=step5(GI)
IHlength=size(GI,1);
IWlength=size(GI,2);
tempi(1:IHlength,1)=0;
i=1;
ni=1;
Returni=0;
while i<=IWlength
t=1;
if min(GI(:,i)==tempi)
while min(GI(:,i)==tempi)
t=t+1;
i=i+1;
if i>IWlength
i=i-1;
Returni(ni)=i;
ni=ni+1;
return;
end
end
i=i-1;
else

Returni(ni)=i;
ni=ni+1;
tempi=GI(:,i);
end
i=i+1;
end

end

处理结果:



最后将处理的结果图转化为44×43矩阵
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: