def static_pixel_num(image_dir, target_phase='PV'):
    # {0: 217784361, 1: 1392043, 2: 209128, 3: 1486676, 4: 458278, 5: 705482}
    # {0: 1.0, 156, 1041, 146, 475, 308}
    static_res = {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0}
    from convert2jpg import extract_bboxs_mask_from_mask
    from config import pixel2type, type2pixel
    for sub_name in ['train', 'val', 'test']:
        names = os.listdir(os.path.join(image_dir, sub_name))
        for name in names:
            cur_slice_dir = os.path.join(image_dir, sub_name, name)
            mhd_mask_path = glob(
                os.path.join(cur_slice_dir, 'Mask_%s*.mhd' % target_phase))[0]

            mask_image = read_mhd_image(mhd_mask_path)
            min_xs, min_ys, max_xs, max_ys, names, mask = extract_bboxs_mask_from_mask(
                mask_image, os.path.join(cur_slice_dir, 'tumor_types'))

            for key in pixel2type.keys():
                mask[mask == key] = type2pixel[pixel2type[key]][0]
            pixel_value_set = np.unique(mask)
            print(pixel_value_set)
            for value in list(pixel_value_set):
                static_res[value] += np.sum(mask == value)
    print(static_res)
Esempio n. 2
0
def dicom2jpg_multiphase_tripleslice_mask(slice_dir, save_dir, phase_names, target_phase_name):
    '''
    前置条件:已经将dicom格式的数据转为成MHD格式,并且已经提出了slice,一个mhd文件只包含了三个slice
    针对每个phase提取三个slice(all), 但是mask还是只提取一个
    保存的格式是name_nc.jpg, name_art.jpg, name_pv.jpg
    :param slice_dir:
    :param save_dir:
    :param phase_names:
    :param target_phase_name:
    :return:
    '''
    total_phase_name = ''.join(phase_names)
    total_phase_name += '_tripleslice_mask'
    target_phase_mask = None
    mhd_images = []
    for phase_name in phase_names:
        mhd_image_path = os.path.join(slice_dir, 'Image_' + phase_name + '.mhd')
        mhd_mask_path = os.path.join(slice_dir, 'Mask_' + phase_name + '.mhd')
        mhd_image = read_mhd_image(mhd_image_path)
        mask_image = read_mhd_image(mhd_mask_path)
        mhd_image = np.asarray(np.squeeze(mhd_image), np.float32)
        mhd_image = np.transpose(mhd_image, axes=[1, 2, 0])
        if phase_name == target_phase_name:
            target_phase_mask = mask_image
        _, _, depth_image = np.shape(mhd_image)
        if depth_image == 2:
            mhd_image = np.concatenate(
                [mhd_image,
                 np.expand_dims(mhd_image[:, :, np.argmax(np.sum(np.sum(mask_image, axis=1), axis=1))], axis=2)],
                axis=2
            )
            print('Error')
        mhd_images.append(mhd_image)
    # mhd_image = np.expand_dims(mhd_image, axis=2)
    # mhd_image = np.concatenate([mhd_image, mhd_image, mhd_image], axis=2)
    mhd_image = np.concatenate(mhd_images, axis=-1)
    mask_image = target_phase_mask
    mask_image = np.asarray(np.squeeze(mask_image), np.uint8)
    max_v = 300.
    min_v = -350.
    mhd_image[mhd_image > max_v] = max_v
    mhd_image[mhd_image < min_v] = min_v
    print(np.mean(mhd_image, dtype=np.float32))
    mhd_image -= np.mean(mhd_image)
    min_v = np.min(mhd_image)
    max_v = np.max(mhd_image)
    interv = max_v - min_v
    mhd_image = (mhd_image - min_v) / interv
    file_name = os.path.basename(slice_dir)
    dataset_name = os.path.basename(os.path.dirname(slice_dir))


    print('the shape of mhd_image is ', np.shape(mhd_image), np.min(mhd_image), np.max(mhd_image))
    print('the shape of mask_image is ', np.shape(mask_image))
    for phase_idx, phase_name in enumerate(['NNC', 'ART', 'PPV']):
        save_path = os.path.join(save_dir, total_phase_name, dataset_name,
                                 file_name + '_%s.%s' % (phase_name, image_suffix_name))
        if not os.path.exists(os.path.dirname(save_path)):
            os.makedirs(os.path.dirname(save_path))
        if image_suffix_name == 'jpg':
            cv2.imwrite(save_path, mhd_image[:, :, phase_idx * 3: (phase_idx + 1) * 3] * 255)
        else:
            cv2.imwrite(save_path, np.asarray(mhd_image[:, :, phase_idx * 3: (phase_idx + 1) * 3] * 255, np.int32))
    if not os.path.exists(os.path.join(save_dir, total_phase_name, dataset_name + '_mask')):
        os.mkdir(os.path.join(save_dir, total_phase_name, dataset_name + '_mask'))
    if not os.path.exists(os.path.join(save_dir, total_phase_name, dataset_name + '_mask_vis')):
        os.mkdir(os.path.join(save_dir, total_phase_name, dataset_name + '_mask_vis'))
    real_mask_save_path = os.path.join(save_dir, total_phase_name, dataset_name + '_mask', file_name + '.' + image_suffix_name)
    vis_mask_save_path = os.path.join(save_dir, total_phase_name, dataset_name + '_mask_vis', file_name + '.' + image_suffix_name)
    xml_save_dir = os.path.join(save_dir, total_phase_name, dataset_name+'_xml')
    if not os.path.exists(xml_save_dir):
        os.makedirs(xml_save_dir)

    evulate_gt_dir = os.path.join(save_dir, total_phase_name, dataset_name+'_gt')
    if not os.path.exists(evulate_gt_dir):
        os.makedirs(evulate_gt_dir)

    xml_save_path  = os.path.join(xml_save_dir, file_name + '.xml')
    gt_save_path = os.path.join(evulate_gt_dir, file_name + '.txt') # for evulate

    doc = Document()
    root_node = doc.createElement('annotation')
    doc.appendChild(root_node)

    folder_name = os.path.basename(save_dir) + '/' + total_phase_name
    folder_node = doc.createElement('folder')
    root_node.appendChild(folder_node)
    folder_txt_node = doc.createTextNode(folder_name)
    folder_node.appendChild(folder_txt_node)

    file_name = file_name + '.jpg'
    filename_node = doc.createElement('filename')
    root_node.appendChild(filename_node)
    filename_txt_node = doc.createTextNode(file_name)
    filename_node.appendChild(filename_txt_node)

    shape = list(np.shape(mhd_image))
    size_node = doc.createElement('size')
    root_node.appendChild(size_node)
    width_node = doc.createElement('width')
    width_node.appendChild(doc.createTextNode(str(shape[0])))
    height_node = doc.createElement('height')
    height_node.appendChild(doc.createTextNode(str(shape[1])))
    depth_node = doc.createElement('depth')
    depth_node.appendChild(doc.createTextNode(str(3)))
    size_node.appendChild(width_node)
    size_node.appendChild(height_node)
    size_node.appendChild(depth_node)

    # mask_image[mask_image != 1] = 0
    # xs, ys = np.where(mask_image == 1)
    # min_x = np.min(xs)
    # min_y = np.min(ys)
    # max_x = np.max(xs)
    # max_y = np.max(ys)
    min_xs, min_ys, max_xs, max_ys, names, mask = extract_bboxs_mask_from_mask(mask_image,
                                                                               os.path.join(slice_dir, 'tumor_types'))

    cv2.imwrite(vis_mask_save_path, np.asarray(mask, np.int32))
    for key in pixel2type.keys():
        mask[mask == key] = type2pixel[pixel2type[key]][0]
    cv2.imwrite(real_mask_save_path, np.asarray(mask, np.int32))

    lines = []
    for min_x, min_y, max_x, max_y, name in zip(min_xs, min_ys, max_xs, max_ys, names):
        object_node = doc.createElement('object')
        root_node.appendChild(object_node)
        name_node = doc.createElement('name')
        name_node.appendChild(doc.createTextNode(name))
        object_node.appendChild(name_node)
        truncated_node = doc.createElement('truncated')
        object_node.appendChild(truncated_node)
        truncated_node.appendChild(doc.createTextNode('0'))
        difficult_node = doc.createElement('difficult')
        object_node.appendChild(difficult_node)
        difficult_node.appendChild(doc.createTextNode('0'))

        bndbox_node = doc.createElement('bndbox')
        object_node.appendChild(bndbox_node)
        xmin_node = doc.createElement('xmin')
        xmin_node.appendChild(doc.createTextNode(str(min_y)))
        bndbox_node.appendChild(xmin_node)

        ymin_node = doc.createElement('ymin')
        ymin_node.appendChild(doc.createTextNode(str(min_x)))
        bndbox_node.appendChild(ymin_node)

        xmax_node = doc.createElement('xmax')
        xmax_node.appendChild(doc.createTextNode(str(max_y)))
        bndbox_node.appendChild(xmax_node)

        ymax_node = doc.createElement('ymax')
        ymax_node.appendChild(doc.createTextNode(str(max_x)))
        bndbox_node.appendChild(ymax_node)

        line = '%s %d %d %d %d\n' % (name, min_y, min_x, max_y, max_x)
        print(line)

        lines.append(line)

    with open(xml_save_path, 'wb') as f:
        f.write(doc.toprettyxml(indent='\t', encoding='utf-8'))
    with open(gt_save_path, 'w') as f:
        f.writelines(lines)
        f.close()