如何用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矩阵
相关文章推荐
- 如何解决webView手势放大缩小,设置不起作用
- Matlab中绘制boxplot时如何改变线宽
- Webpack如何打包才能尽可能的缩小体积(详解)
- 用matlab处理蚂蚁迷宫问题
- Intellij IDEA如何使用Maven Tomcat Plugin运行web项目(转)
- matlab中使用sql语言查询过程中如何在select语句中使用变量
- 云平台编程与开发(四):如何将已有的java Web项目部署到云平台?
- Web表单中,如何使用回车键在TextBox中提交请求
- java工程如何修改成web工程,并进行jsp页面的访问?
- matlab figure 调整大小、字体、线宽
- 如何在Web页面上直接打开、编辑、创建Office文档
- matlab之如何设置colormap, 以一个figure中画多幅图
- matlab如何保存figure中去掉白边的图片
- web前端 | 如何选择撸码神器
- maven项目中如何创建web.xml
- 如何选择Web开发框架(转)
- SQL Server 2000数据库的事务日志文件过大,如何将其缩小?
- 谈谈在WebServer中如何实现CGI技术
- 如何用VS2005制作Web安装程序
- 【matlab】:matlab如何让一张图里面能画多个控件?