DICOM 영상의 프레임 정보를 추출하다 에러가 발생해 원인을 확인하다 찾아본 내용을 정리해 둡니다. 영상처리에선 어찌 보면 기본적인 내용일 수도 있지만 혹시 제가 겪은 문제와 유사한 경험을 하시는 분들에게 도움이 되었으면 합니다.

 

 

 

1.  문제: Offset 정보 추출 실패

 

시작은 DICOM 영상의 offset 정보를 추출하는 것으로부터 시작되었습니다. 영상을 정상적으로 로드해왔으나 DcmPixelSequence에서 getItem을 해오는 과정에서 이상한 현상이 발생하였습니다.

 

 

 

2. 현상

 

해당 영상을 Weasis로 오픈해 TransferSyntax를 확인한 결과 MPEG2 영상으로 확인되었습니다.

DICOM 영상의 TransferSyntax

DICOM 파일에서 영상만 추출해 ffmpeg로 모든 프레임을 추출한 결과 총 360장의 프레임을 추출할 수 있었습니다. 따라서 내부 로직에서 프레임의 개수는 360이 되어야 한다고 추측하고 있었습니다.

영상에서 추출해낸 프레임

하지만 DCMTK 디버그 결과 첫 번째 프레임에서 모든 영상의 크기만큼의 바이트를 불러오고 두 번째 프레임에선 null을 리턴하고 있었습니다.

추출한 MPEG2 영상의 파일 크기
첫번째 오프셋 추출 정보.

위의 사진에서 확인하듯이 첫 번째 오프셋에서 모든 길이를 다 가져오고 있었으며 아래의 사진에서 볼 수 있듯이 두 번째 오프셋에서는 NULL값을 확인할 수 있었습니다.

두번 째 오프셋 추출 정보.

 

 

 

3. 원인: MEPG2

 

확인 후 결론부터 말씀드리자면 해당 동작은 정상이었으며 DCMTK와 MPEG2의 특징을 잘 이해하지 못한 제가 오류로 인식하고 있던 상황이었습니다.

 

https://forum.dcmtk.org/viewtopic.php?p=9897#p9897 

 

how to extract frames from DICOM "Mpeg2 Main Profile @ Main Level" file - DICOM @ OFFIS

All other questions regarding DCMTK Moderator: Moderator Team Ro2a Posts: 9 Joined: Fri, 2010-09-17, 17:14 #1 Post by Ro2a » Tue, 2010-09-21, 00:24 Hello I want to develope a programe using VS c++ and dcmtk that can load a dicom file which has the followi

forum.dcmtk.org

위 링크의 답변을 인용해 보자면 다음과 같습니다.

 

For compressed pixel data you have to use the DcmPixelSequence class due to the internal structure of the compressed PixelData element. This gives you acccess to the included offset table (empty for MPEG2) and all frames. However, for MPEG2 there is only a single "frame" containing all MPEG2 data as a blob. You won't be able to access individual frames with DCMTK because DCMTK does not know how to decompress MPEG2 data and hence is not able to find out where a specific frame begins.

So you have to get the complete MPEG2 data, and then decompress it using another library. I will post an example how to do that soon in the wiki and reference here in the forum topic.

 

DCMTK에서 MPEG2의 오프셋 정보를 얻기 위해선 MPEG2 영상의 BLOB 데이터를 로드해 온 뒤 FFMPEG와 같은 외부 라이브러리를 사용해 압축을 풀고 난 뒤에야 오프셋 정보 추출을 시도할 수 있었습니다.

 

 

 

기반 지식이 얼마나 중요한지 다시 깨달아 가는 문제였습니다. 오늘도 하나 더 배우고 갑니다.

 

 

 

 

 

반응형

+ Recent posts