简介

图像分割类似于图像分类,将单个或多个类别分配给图像。然而,对于分割任务,类被分配给图像的每个像素。因此,执行图像分割任务的深度学习模型旨在识别属于某个类别的每个像素。这个任务有很多用例,比如它在医学成像、自动化行业、卫星成像等方面的应用。本文将深入研究医学成像领域并使用数据集[1]包含与不同器官有关的肿瘤的组织图像。 数据集文章[1] 于 2017 年发表在 IEEE Transactions on Medicalimaging 上,该文章的代码发表在 本网站上。

本文中的代码演示了如何将 xml 文件中包含的逐像素注释转换为二进制掩码。下面演示的代码是从这个 GitHubrepo修改的,它基于 2021文章[2] 发表在 IEEE Transactions on Medical Imaging 上。图 1 左侧显示了示例图像,右侧显示了生成的蒙版。

merge_test.jpgFigure1:原始图像[1]和生成的掩码。

XML 注释

要读取生成掩码所需的相关数据,代码必须读取 xml 文件中的每个 Vertex 节点。要到达顶点节点,代码必须遍历以下节点结构:Annotation > Regions > Region > Vertices > Vertex。这可以在图 2 中看到,这是 xml 文件中包含的数据的示例。

xml_example.png图 2:包含掩码生成所需数据的示例 xml 文件[1].

代码说明

首先,需要导入所有必需的库。对于此任务,os 库用于遍历文件夹。 numpy 库用于数据操作。 Open-cv 用于读取图像。 Skimage 用于绘制二进制掩码的多边形。 xml 库用于读取和遍历 xml 字段,最后使用 tqdm 库显示进度条。

import os
import numpy as np
import cv2
from skimage import draw
import xml.etree.ElementTree as ET
from tqdm import tqdm

导入库后,设置与图像数据路径、xml 注释和掩码的输出路径有关的变量。

image_path = './MoNuSeg 2018 Training Data/MoNuSeg 2018 Training Data/Tissue Images' # Path to save binary masks corresponding to xml files
data_path = './MoNuSeg 2018 Training Data/MoNuSeg 2018 Training Data/Annotations' #Path to read data from
destination_path = './MoNuSeg 2018 Training Data/MoNuSeg 2018 Training Data/Masks' # Path to save binary masks corresponding to xml files

之后,读取所有 xml 文件的名称并将其存储在 annotations 变量中。

annotations = [x[2] for x in os.walk(data_path)][0] #Names of all xml files in the data_path

对于每个注释文件,文件被解析并且代码遍历节点并读取掩码的所有坐标。根据蒙版坐标绘制一个多边形,最终生成的蒙版保存在输出目录中。

for name in tqdm(annotations):
    tree = ET.parse(f'{data_path}/{name}')
    root = tree.getroot()

    child = root[0]
    for x in child:
        r = x.tag
        binary_mask = np.transpose(np.zeros((1000, 1000)))

        if r == 'Regions':
            for y in x:
                y_tag = y.tag

                if y_tag == 'Region':
                    regions = []
                    vertices = y[1]
                    coords = np.zeros((len(vertices), 2))
                    for i, vertex in enumerate(vertices):
                        coords[i][0] = vertex.attrib['X']
                        coords[i][1] = vertex.attrib['Y']        
                    regions.append(coords)

                    vertex_row_coords = regions[0][:,0]
                    vertex_col_coords = regions[0][:,1]
                    fill_row_coords, fill_col_coords = draw.polygon(vertex_col_coords, vertex_row_coords, binary_mask.shape)
                    binary_mask[fill_row_coords, fill_col_coords] = 255

            mask_path = f'{destination_path}/{name[:-4]}.jpg'
            cv2.imwrite(mask_path, binary_mask)

结论

图像分割是计算机视觉中的一个领域,对很多领域都有广泛的影响。为图像生成掩码是构建分割管道的第一步。本文展示了如何在 xml 文件中获取注释并将它们转换为二进制掩码,以及医学成像中的用例之一。

参考文献

[1] N. Kumar、R. Verma、S. Sharma、S. Bhargava、A. Vahadane 和 A. Sethi,“用于计算病理学的广义核分割的数据集和技术”,IEEE 医学影像汇刊, 卷。 36,没有。 7,第 1550-1560 页,2017 年 7 月,doi:10.1109/TMI.2017.2677499。

[2] R. Verma 等人,“MoNuSAC2020:多器官核分割和分类挑战”,载于 IEEE Transactions on Medical Imaging,vol。 40,没有。 12,第 3413-3423 页,2021 年 12 月,doi:10.1109/TMI.2021.3085712。

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐