많은 사람들이 분명 dcm을 그대로 png로 저장할 때, 어려움을 겪을 것이다. 그대로 png로 변환하면 안된다.
png로 변환할 때, 그 공식이 있기 때문에 그 넓은 범위를 png로 변환한다면 안되기 때문이다.
dcm은 기본적으로 정해진 데이터나 데이터셋마다 다르지만, contrast enhanced CT 영상같은 경우에는 이미 지정되잇는 범위가 있지만 없다면 범위가 후덜덜하다.
CT에서는 기본적으로 범위가 -2000 ~ 2000 정도라고 생각하면된다.
근데 예로 들어, contrast enhanced CT 같은 경우에는 -1024 ~ 1024 뭐 이렇게 되 있는 것도 있다. np.max,min을 해보면?
무튼...
import pydicom
import numpy as np
dcm = pydicom.read_file('파일명.dcm')
arr = dcm.pixel_array()
이렇게 우선 읽고.
arr = arr * dcm.RescaleSlope + dcm.RescaleIntercept
이렇게 해주면 된다.
그리고 나서 HU 값 제한을 할거면, 또는 Windowing을 하고 싶다면
예를 들어 HU [-200,200] 으로 하고싶다면...
arr[arr<-200] = -200
arr[arr>200] = 200
이렇게 해주면 되고,
툴에서 나타나는 거랑 똑같은 HU 값으로 하고 싶다면... 그건 window level과 window width와 관련있기 때문에
print(dcm)을 통해 window center가 멀티 값인지 ,아니면 하나 값인지 확인부터 하자.
어떤 거는 [30,30] 이렇게 되어있고, 어떤 거는 30 이렇게 되어있음.
멀티값이라면 이렇게 하고, 단일값이면 그냥 [0]을 없애고 하자.
min = int(dcm.WindowCenter[0]) - (int(dcm.WindowWidth[0]/2))
max = int(dcm.WindowCenter[0]) + (int(dcm.WindowWidth[0]/2))
arr [ arr < min ] = min
arr [ arr > max ] = max
이렇게 적용하면 툴에서랑 똑같이 보인다.
원리는 CT에 관해서 잘 알면 된다. Window와 RescaleSlope , Intercept 개념을 정확히 알자. 그러면 어떻게 HU로 변환되는 지도 알 수 있다.
그리고 마지막으로...
png로 저장하고 싶다면 그대로
import scipy.misc
scipy.misc.imsave('1.png', arr)
로 해주면 끝.
dcm으로 그대로 저장하고 싶으면 dcm으로 저장해도 되고, 아니면 np.save를 통해 np로 해도 된다.
보통 dcm들 통째로 저장하는 경우가 있기 때문에 나 같은 경우에는 np로 변환해서 저장하는 타입