天天看點

Dicom圖像去tag标簽 版本1(完整代碼)

有時候拿到的Dicom圖像是裝置商打上tag标簽的,這種标簽的灰階值明顯高于或者低于人體組織,在後續的算法中如果需要對圖像進行歸一化或者規範化處理,如果不能去掉這個标簽,因為其灰階值的差異會顯著影響歸一化的結果進而導緻最終的結果異常(這一點本人在深度學習模型上測試過)。标簽如下圖所示:這個R就是典型的标簽

Dicom圖像去tag标簽 版本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(完整代碼)
Dicom圖像去tag标簽 版本1(完整代碼)

繼續閱讀