某个像素点连通情况的判断
背景:已获得血管分割二值图像的骨架图像,判断某个像素点代表了血管的端点、内部点、分叉点,还是交叉点。
1、取出需要判断点的八邻域并编号:
这里采用顺时针编号。
2、计算下面的表达式:
对于像素点的连通数的计算方法为:
I
n
(
x
,
y
)
=
0.5
(
∑
i
=
1
8
∣
N
i
(
x
,
y
)
−
N
i
+
1
(
x
,
y
)
∣
)
In(x,y) = 0.5(\sum_{i=1}^{8}|N_{i}(x,y)-N_{i+1}(x,y)|)
In(x,y)=0.5(i=1∑8∣Ni(x,y)−Ni+1(x,y)∣)
N(x,y)为对应编号像素取值(0或1)。
个人理解:相同区域内的像素值一样,相减为0,不会增加计算式的值;而跨区域了,则相减为1,且一个区域会分别在起始和结束产生这样的变化,所以除以0.5。
3、确定该像素点的属性
连通数为1:端点;
连通数为2:内部点;
连通数为3:分叉点;
连通数为4:交叉点。
Matlab代码:对整幅图像进行连通性标记,默认边缘为0连通。
% 为图像的细化点进行标记,0--其他;1--端点;2--内部点;3--分叉点;4--交叉点
function labelimg = LabelPoints(imgxi)
labelimg = zeros(size(imgxi)); % 基本上最外围数据不会有血管,最外面一层可以设置为0
position_x = [-1 0 1 1 1 0 -1 -1 -1]; % 从左上角开始顺时针进行,x为水平,左上角为(0,0)
position_y = [-1 -1 -1 0 1 1 1 0 -1]; %
[rnum,cnum] = size(imgxi);
for j = 2:1:cnum-1 % x
for i=2:1:rnum-1 % y
if(imgxi(i,j)==0) % 非细化点
continue;
end
I = 0;
for p = 1:1:8
% 肯定有八邻域,就不判断了
I = I + abs(imgxi(i+position_y(p+1),j+position_x(p+1))-imgxi(i+position_y(p),j+position_x(p)));
end
I = floor(I/2);
labelimg(i,j) = I;
end
end
end
参考文献:Fraz M M, Remagnino P, Hoppe A , et al. Quantification of blood vessel calibre in retinal images of multi-ethnic school children using a model based approach. Comput Med Imaging Graph, 2013, 37(1): 48~60.