基于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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值