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

例图:

整个处理过程分为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矩阵



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值