概述
也是最近想要研究一下图像细化,又不想用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)