Dicom图像去tag标签 版本1(完整代码)

有时候拿到的Dicom图像是设备商打上tag标签的,这种标签的灰度值明显高于或者低于人体组织,在后续的算法中如果需要对图像进行归一化或者规范化处理,如果不能去掉这个标签,因为其灰度值的差异会显著影响归一化的结果从而导致最终的结果异常(这一点本人在深度学习模型上测试过)。标签如下图所示:这个R就是典型的标签

Dicom图像去tag标签 版本1(完整代码)_第1张图片

去除标签的目的,不仅仅在于将这个值改为一个别的什么值,还需要确保这个区域的更改不能引起图像结构上的变化,如果造成结构上剧烈的变化(如果简单的采用填充某些值的话,在实际测试过程中本人确实观察到结构的变化,即在填充处出现模糊块或者暗色块),那么得不偿失。这里的解决思路是将其看做image inpainting的问题,目前常用的算法来源于这样一篇文章(An Image Inpainting Technique Based on the Fast Marching Method,  后续文档会进行该文章的解释)

如上所述:解决去标签后不显著改变图像结构的具体思路可以分为两部分:1. 找到需要修改的地方,即标签所在位置 2. 使用上文所记载的算法进行图像修复。现在将两部分的代码公布如下:

需要支出的是,现在的这种版本只能对付按照dicom规定的标准打上标签的情况,在实际情况中存在不按照dicom标准打私签的情况,这种图像的去标签放在下一篇博客讨论。

# 第一部分白色标签阈值ds为dcm读入的dcm数据,使用pydicom读入
whitetag = pow(2, ds[0x0028, 0x0101].value) - 1
whitetagwide = 5

pos = np.where(img > (whitetag - whitetagwide))

 

# 第二部分,生成mask指定修改位置,以及使用论文算法进行修复
mask = np.zeros((img.shape[0], img.shape[1]), dtype=np.uint8)

for i, j in zip(pos[0], pos[1]):
    mask[i, j] = 1
img = img.astype(np.uint16)
img_new = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)

return img_new

 

修复后的结果以及mask图如下所示,可以看到标签被去掉,并且没有改变图像结构:

Dicom图像去tag标签 版本1(完整代码)_第2张图片

 

Dicom图像去tag标签 版本1(完整代码)_第3张图片

你可能感兴趣的:(图像处理)