基于matlab的二值图像细化代码,效果与matlab自带函数bwmorph相差无几

概述

也是最近想要研究一下图像细化,又不想用matlab自带的函数库,就查找了一些资料去整图像细化的原理,看了一些博客写的针布戳。也就记录一下了。

原理

其实也就在要细化的目标左右两边分别满足四个条件,让目标向着中心细化,以致于目标如果是线段,那么细化得到的结果就是线段的中心线。

  • 将obj赋值给objcopy,遍历objcopy,若objcopy(i,j)满足不为0则继续(p1)。
    八邻域
  • objcopy(i,j)的八邻域满足2<= p2+p3+p4+p5+p6+p7+p8+p9<=6则继续
  • p2->p9->p2的排列顺序中,01模式的数量为1则继续
  • p2p4p6 = 0则继续
  • p4p6p8 = 0 = 0则继续
    同时满足以上四个条件的点则在objcopy中把该点赋值0,再令obj=objcopy。
    再进行另一个方向上的选择。
  • 将obj赋值给objcopy,遍历objcopy,若objcopy(i,j)满足不为0则继续(p1)。
  • objcopy(i,j)的八邻域满足2<= p2+p3+p4+p5+p6+p7+p8+p9<=6则继续
  • p2->p9->p2的排列顺序中,01模式的数量为1则继续
  • p2p4p6 = 0则继续
  • p2p6p8 = 0 = 0则继续
    同时满足以上四个条件的点则在objcopy中把该点赋值0,再令obj=objcopy。

对上述过程进行有限次迭代,则能达到细化图像的目的

代码

%图像细化函数;若目标线段在图像内部或目标线段不与图像边界连接,则原则上细化后的线比原线段短,略比自带函数bwmorph(obj,'thin',Inf)更短。
%img:二值图像
%iter_num:迭代次数
function bw = thin_func(img, iter_num)
    obj = img;
    [m,n,~] = size(obj);
    copyobj = obj;
    for iter = 1:iter_num
        for i = 2:m-1
            for j = 2:n-1
                p = zeros(9,1);%用于存储像素(i,j)的八领域值
                if obj(i,j)==0
                    continue;
                end
                p(1) = obj(i-1,j);
                p(2) = obj(i-1, j+1);
                p(3) = obj(i, j+1);
                p(4) = obj(i+1, j+1);
                p(5) = obj(i+1, j);
                p(6) = obj(i+1, j-1);
                p(7) = obj(i, j-1);
                p(8) = obj(i-1, j-1);
                p(9) = obj(i-1,j);
                %condition 1:八领域中,不为0的个数在[2,6]之间,
                if 2>sum(p)&&sum(p)>6
                    continue;
                end
                num=0;
                for k = 1:8
                    if p(k)==0 && p(k+1)==1
                        num = num+1;
                    end
                end
                %condition 2:八领域中,按相邻元素排序,相邻像个元素出现'01'模式的数量为1
                if num>1
                    continue;
                end
                %condition 3:八领域中,246的乘积为0
                if p(1)*p(3)*p(5)~=0
                    continue;
                end
                %condition 4:八领域中,468的乘积为0
                if p(3)*p(5)*p(7)~=0
                    continue;
                end
                copyobj(i,j)=0;
            end
        end
        obj = copyobj;
        copyobj = obj;
        for i = 2:m-1
            for j = 2:n-1
                p = zeros(9,1);
                if obj(i,j)==0
                    continue;
                end
                p(1) = obj(i-1,j);% 
                p(2) = obj(i-1, j+1);
                p(3) = obj(i, j+1);
                p(4) = obj(i+1, j+1);
                p(5) = obj(i+1, j);
                p(6) = obj(i+1, j-1);
                p(7) = obj(i, j-1);
                p(8) = obj(i-1, j-1);
                p(9) = obj(i-1,j);
                %condition 1
                if 2>sum(p)&&sum(p)>6
                    continue;
                end
                num=0;
                for k = 1:8
                    if p(k)==0 && p(k+1)==1
                        num = num+1;
                    end
                end
                %condition 2
                if num~=1
                    continue;
                end
                %condition 3:八领域中,248的乘积为0
                if p(1)*p(3)*p(7)~=0
                    continue;
                end
                %condition 4:八领域中,268的乘积为0
                if p(1)*p(5)*p(7)~=0
                    continue;
                end
                copyobj(i,j)=0;
            end
        end
        obj = copyobj;
        copyobj = obj;
    end
    bw = obj;
end

效果


在这里插入图片描述

在这里插入图片描述

DONE!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值