概述
也是最近想要研究一下图像细化,又不想用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:八领域中,2、4、6的乘积为0
if p(1)*p(3)*p(5)~=0
continue;
end
%condition 4:八领域中,4、6、8的乘积为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:八领域中,2、4、8的乘积为0
if p(1)*p(3)*p(7)~=0
continue;
end
%condition 4:八领域中,2、6、8的乘积为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
效果
前

后

1万+

被折叠的 条评论
为什么被折叠?



