Category: DICOM

  • DICOM 태그 삭제

    DICOM 태그를 보다 많이 일괄적으로 삭제하는 방법은 다음과 같다.

    보통 사용하는 DICOM 태그의 경우 0x0002 부터 0x0040까지 여러 종류가 있다. file_meta는 따로 삭제한다. 코드는 다음과 같다.

    ds = pydicom.dcmread("/tmp/RAW/tmp_chest_pa.dcm")
    
    del ds.file_meta
    del ds[(0x0001,0x0000):(0x0041,0x0000)]
    
    ds.save_as("/tmp/MOD/" + UUID + "/" + UUID + ".dcm")
  • DICOM 파일 수정 후 업로드

    DICOM을 제대로 취급하는 곳이라면 DICOM 파일을 생성시에 UID를 제대로 만들기 때문에 중복되는 일이 없다. 그런데 이전에 언급한 가짜 DICOM 이미지 파일을 만들기 위해서는 UID 를 적절하게 변경해 주어야 한다. 1명의 환자에서 2개의 검사가 시행되었는데 UID를 수정해 주지 않으면 2번째 입력한 것부터 입력이 되지 않는다.

    여러 시행 착오 끝에 Orthanc 에서는 StudyInstanceUID를 고유하게 지정해 주면 된다는 것을 알게 되었다. DICOM의 UID는 보통 숫자와 마침표로 구성되어 있지만 사실 어떤 형식이라도 상관 없다. 그래서 UUID를 이용하였다.

    for idx in range(len(echo_result)):
    
        UUID = str(uuid.uuid4())
    
        ds = pydicom.dcmread('/root/US_ECHO_TEMPLATE.dcm')
        ds.StudyInstanceUID = UUID
    
        ds.save_as("/tmp/RAW/echo_new.dcm")
        os.system("storescu rcc02.work 4242 /tmp/RAW/echo_new.dcm")
    
  • Downsize DICOM file

    심장 초음파 결과가 Orthanc에 없다보니 결과 처리할 때 항상 따로 해주어야 하는 불편함이 있었다. 그렇다고 심장 초음파 이미지를 DICOM 서버로 등록시켜봐야 심장 초음파 결과지 내용을 볼 수 있는 것도 아니고, 이미지 1장당 18메가 정도 하는데 이것이 수십장 씩 있다 보니 경제적이지도 않다. 그래서 현재 필요한 것은 EF 뿐이니 이것을 분석에 사용하지 않는 DICOM tag로 입력시키고, 저해상도 이미지 파일을 등록시키는 식으로 하기로 했다.

    # authors : Guillaume Lemaitre <g.lemaitre58@gmail.com>
    # license : MIT
    
    import pydicom
    from pydicom.data import get_testdata_file
    
    print(__doc__)
    
    # FIXME: add a full-sized MR image in the testing data
    filename = get_testdata_file('MR_small.dcm')
    ds = pydicom.dcmread(filename)
    
    # get the pixel information into a numpy array
    data = ds.pixel_array
    print('The image has {} x {} voxels'.format(data.shape[0],
                                                data.shape[1]))
    data_downsampling = data[::8, ::8]
    print('The downsampled image has {} x {} voxels'.format(
        data_downsampling.shape[0], data_downsampling.shape[1]))
    
    # copy the data back to the original data set
    ds.PixelData = data_downsampling.tobytes()
    # update the information regarding the shape of the data array
    ds.Rows, ds.Columns = data_downsampling.shape
    
    # print the image information given in the dataset
    print('The information of the data set after downsampling: \n')
    print(ds)

    downsampling 부분을 보면 이미지 파일에서 일정 간격으로 (여기서는 1/8로 줄이기 위하여) 값들을 선택하여 크기 자체를 줄이고 .tobytes 를 이용해서 변환하는 것을 볼 수 있다. 그래서 그렇게 했다. 난 용량이 작은 것이 필요하니 :8대신에 :200으로 했다.

    ds = pydicom.dcmread('/root/US_ECHO_TEMPLATE.dcm')
    data = ds.pixel_array
    data_downsampling = data[:,::200, ::200,:]
    ds.PixelData = data_downsampling.tobytes()
    _, ds.Rows, ds.Columns,_ = data_downsampling.shape
    ...
    ds.save_as("/tmp/RAW/echo_new.dcm")
    os.system("storescu rcc02.work 4242 /tmp/RAW/echo_new.dcm")
  • DCMTK  

    DICOM 서버에 파일을 직접 전송해야 할 경우가 있다. 이럴 경우에 사용하는 패키지이다.

    apt install dcmtk

    파일을 전송할 때 사용하는 프로그램은 storescu 이다.

    storescu [options] peer port dcmfile-in...

    사용방법은 매우 단순하다. 나의 경우에는 다음과 같이 사용한다.

    storescu rcc02.work 4242 /tmp/RAW/echo_new.dcm