本文目的是根据细胞中心点的德劳内三角形图计算一些统计量,定量地描述细胞的空间结构特征,使用的软件为Matlab 2018b。德劳内三角形(Delaunay)的定义和特点这里不再赘述,有兴趣钻研的小伙伴请自行百度。
本文中使用例子为TCGA细胞分割数据集中的一张,原始图像(尺寸为1000×1000)如下左,相应的细胞分割图(二值图)如下右,计算德劳内三角形使用的是右边的细胞分割图,原始图像不参与计算。
首先根据细胞分割图计算每个细胞(白色连通域)的中心点,并根据这些中心点得到德劳内三角形
% 读取细胞分割图像
mask = imread('C:\Users\Administrator\Desktop\mask.png');
% 将细胞分割图像转换为0-1二值图
mask = imbinarize(mask);
% 进行孔洞填充处理
mask = imfill(mask, 'hole');
% 进行连通域标号操作
L = bwlabel(mask);
% 计算每个细胞(白色连通域)的中心点坐标
C = regionprops(L, 'centroid');
% 变量centroids是一个行数为连通域个数,列数为2的矩阵
% 第一列存放的是每个细胞中心点的横坐标
% 第二列存放的是每个细胞中心点的纵坐标
centroids = cat(1, C.Centroid);
% 展示标记图像
imshow(mask);
hold on
% 求得德劳内三角图并用红色显示出来
% 变量del是一个行数为生成三角形个数,列数为3的矩阵
% 每一行上的三个数代表该三角形的三个结点在变量centroids中的行号
% 这个三角形是由这三个结点组成的
del = delaunay(centroids(:,1), centroids(:,2));
triplot(del, centroids(:,1), centroids(:,2), 'r');
运行上面的代码后会展示出如下所示的德劳内三角图,线条颜色已设为红色。
根据德劳内三角求特征只需要上述的centroids变量和del变量即可,通过计算三角形的边长、周长、面积等参数,结合统计学方法即可自由地设计并计算一些特征来描述细胞。
absc = centroids(:, 1);
ordi = centroids(:, 2);
sideidx = 1;
periidx = 1;
areaidx = 1;
for i = 1:size(del, 1)
% 变量tri中存放三角形三个结点的坐标
tri = [absc(del(i,:)), ordi(del(i,:))];
% 变量side用来存储所有三角形的每条边长
side(sideidx) = sqrt((tri(1, 1) - tri(2, 1))^2 + (tri(1, 2) - tri(2, 2))^2);
side(sideidx + 1) = sqrt((tri(1, 1) - tri(3, 1))^2 + (tri(1, 2) - tri(3, 2))^2);
side(sideidx + 2) = sqrt((tri(2, 1) - tri(3, 1))^2 + (tri(2, 2) - tri(3, 2))^2);
% 变量peri用来存储所有三角形的周长
peri(periidx) = side(sideidx) + side(sideidx + 1) + side(sideidx + 2);
periidx = periidx + 1;
sideidx = sideidx + 3;
% 变量area用来存储所有三角形的面积
area(areaidx) = polyarea(tri(:, 1), tri(:, 2));
areaidx = areaidx + 1;
end
% 第一维特征定义为所有三角形中最短边与最长边的比值
delfeats(1) = min(side) / max(side);
% 第二维特征定义为所有三角形边长的标准差
delfeats(2) = std(side);
% 第三维特征定义为所有三角形边长的平均值
delfeats(3) = mean(side);
% 第四维特征定义为所有三角形边长的变异系数
delfeats(4) = std(side) / mean(side);
% 第五维特征定义为所有三角形中最小面积与最大面积的比值
delfeats(5) = min(area) / max(area);
% 第六维特征定义为所有三角形面积的标准差
delfeats(6) = std(area);
% 第七维特征定义为所有三角形面积的平均值
delfeats(7) = mean(area);
% 第八维特征定义为所有三角形面积的变异系数
delfeats(8) = std(area) / mean(area);
代码中的特征仅仅是例子,大家可以发挥自己的想象力,设计出更多特征用于实际任务。