본문 바로가기
Neuroscience

Dicom library, gdcm, 다이콤 라이브러리

by 단창 2012. 2. 28.
다이콤(DICOM:Digital Imaging Communication in Medicine) 은 의료영상 표준규격이다. 
대개 의료영상 형식이 그렇듯 다이콤은 많은 헤더 + 실제 이미지 로 구성되어 있는데
이 헤더가 상당히 복잡하다. 

C code로 나혼자 열어보려고 했지만 너무 복잡해서.. 관두기로 했다. 
그리고 알고 보니 이미 대중적으로 쓰이고 있는 라이브러리 들이 있더라! 

가장 많이 쓰이고 탄탄하게 구성되어있는 것으론

GDCM(Grassroots DICOM library) 

dcmtk(Dicom Toolkit) 

(클릭하면 홈페이지로)
이 있다. 각 라이브러리 모두 itk 등등 공신력 있고 잘나가는 많은 프로그램에 사용된 제대로 검증받은 놈들이다. 

내가 원하는건 
image dimension, voxel info, images 정도인데 난 gdcm를 썻다.
간단히 코드를 보면,
 



int main(int argc, char *argv[])

{


const char *filename = "i707217.MRDC.2090.dcm";

gdcm::ImageReader reader;

reader.SetFileName(filename);



gdcm::Image gimage = reader.GetImage();


cout << "get columns : " << gimage.GetColumns() <<endl;

cout << "get rows : " << gimage.GetRows() << endl;

cout << "get data element : " << gimage.GetDataElement() << endl;

cout << "get Dimensions x: " << gimage.GetDimension(1) << endl;

cout << "get Dimensions y: " << gimage.GetDimension(2) << endl;

cout << "get Dimensions z: " << gimage.GetDimension(3) << endl;

cout << "get origins : " << gimage.GetOrigin() << endl;

unsigned short * img = new unsigned short[64*64];

bool flag = gimage.GetBuffer((char *) img);



FILE * ft;

ft = fopen("test.bin","wb");

fwrite(img,2,64*64,ft);

fclose(ft);


return 0;

}

이렇게 간단하게 할 수있었다!

다만,, 이렇게 이미지를 저장해서 MATLAB의 dicomread와 비교해 보니
270도 돌아가있고 좌우가 플립되어 있었다..-_-
영상마다 좌우 바뀌고 돌아가고 하는게 제일 문제다. 표준이면 표준답게 이런건 지켜줘야지..-_- 뭐가 맞는건지도 모르겠다.

 


돌아간거야 돌리면 되는데, 좌우 플립은 뭐가 맞는건지 난감하다.

 


반응형