본문 바로가기
Web Study

DICOM 정보를 3D로 변환하기 위해선?

by 쿠리의일상 2023. 10. 6.

의료용 이미지와 애플리케이션을 다룰 때 발생하는 문제 중 하나는 좌표계 간의 차이이다.

이미징 애플리케이션에서 일반적으로 사용되는 좌표계는 세계 좌표계, 해부 좌표계, 이미지 좌표계 3가지가 있다.

 

DICOM 이미지

4x1 형태의 행렬로 다뤄지며, Image Position (0020, 0032) 와 Image Orientation (0020, 0037) 로 이루어졌다.

| X_DICOM |
| Y_DICOM |
| Z_DICOM |
|    1    |
  • Image Position (0020, 0032)
    • 3개의 실수로 표현된 (x, y, z) 좌표
    • DICOM 파일의 왼쪽 아래 모서리 좌표에 해당
  • Image Orientation (0020, 0037) 
    • 6개의 숫자로 표현된 코사인값
    • 아래처럼 \로 구분된 6개의 숫자에서 처음 두 쌍은 이미지의 행(x, y)
    • 다음 두 쌍은 이미지의 열 (x, z)
    • 마지막 세번째 쌍은 (y, z) 으로 행과 열을 의미

참고

 

위의 태그들을 사용하여 이미지 픽셀 좌표인 실제 환자 공간 좌표로 변환하고, 각 픽셀의 좌표를 Image Position 에서 얻은 원점으로 오프셋하고, 이미지 픽셀의 행/열 방향으로 Image Orientation 에서 얻은 방향 코사인으로 변환해준다.

환자 기반 좌표계를 사용하며, 알다시피 DICOM 이미지 자체는 2D이므로 3D로 바꿔줘야 한다.

환자 기반 좌표계

3가지 축인 axial, sagittal, coronal로 존재

  • 축면은 지면과 평행하며 머리(상부)와 발(하부)을 분리
  • 관상면은 지면과 수직이며 앞쪽(앞쪽)과 뒤쪽(뒤쪽)을 구분
  • 시상면은 왼쪽과 오른쪽을 구분

 

 

LPS 좌표

표준 의료 영상 좌표계로 DICOM 좌표계에서 3D로 만들기 위한 아핀 행렬을 곱하여 만들어줄 수 있다.

DICOM과 대부분의 의료용 영상 소프트웨어는 모든 데이터를 저장할 때 LPS 좌표계를 사용한다. (환자가 MRI/CT를 찍을 때 누워있으면 x,y,z/LPS 좌표계가 일치하게 되므로)

  • L eft : 환자의 왼쪽
  • P osterior : 환자의 허리 
  • S uperior : 환자의 머리 

 

아핀 행렬

3D 공간에서 변환, 회전, 크기 조정 및 전단 조합을 수학적으로 표현하는 방법

이동과 회전을 함께 표현하려면 공간보다 차원이 1개 더 있는 정사각형 아핀 행렬이 필요하다고 한다.

의료 영상에서 이미지나 물체를 참조 좌표계를 기준으로 위치와 방향을 지정하는 방법을 설명할 때 사용된다.

| a  b  c  x |
| d  e  f  y |
| g  h  i  z |  
| 0  0  0  1 |
  • a~i 값은 회전, 평행 이동, 전단 조합, 크기 조정의 값을 포함하고 있다.
  • x, y, z는 변환 부분을 의미한다.
  • | 0 0 0 1 | 값은 아핀 행렬의 3D 계산을 위한 표준 형식이다.

아핀 행렬 값은 LPS 를 기준으로 DICOM 이미지의 방향과 위치가 어떻게 지정되는지에 따라 달라진다.

 

 

즉 LPS 좌표를 얻기 위해선 DICOM 태그에서 추출해준 4x1 행렬과 아핀 행렬을 곱해줘야 한다.

| a  b  c  x |   | X_DICOM |   | X_LPS |
| d  e  f  y | x | Y_DICOM | = | Y_LPS |
| g  h  i  z |   | Z_DICOM |   | Z_LPS |
| 0  0  0  1 |   |    1    |   |   1   |

 

 

라이브러리 참고

gl-matrix
WebGL 및 3D 그래픽 작업에 사용되는 행렬 및 벡터 연산을 지원
https://github.com/toji/gl-matrix
NumPy
NumPy는 Python의 과학 및 수학 연산을 위한 핵심 라이브러리로, 다차원 배열 및 행렬 연산을 지원https://numpy.org/
SciPy
SciPy는 과학 및 공학 연산을 위한 Python 라이브러리
SciPy의 scipy.spatial.transform 모듈은 아핀 변환 행렬을 계산하는 데 도움이 되는 함수와 도구를 제공
https://www.scipy.org/

 

일단 이해한 내용을 정리만 했다.. 자세한 정보가 적고 어렵다..ㅜㅜ

'Web Study' 카테고리의 다른 글

Content-Type 정리  (0) 2024.03.13
브라우저 저장소 정리  (0) 2024.03.11
Web Graphics Library (WebGL) 기초  (0) 2023.09.27
htmx 살펴보기  (0) 2023.08.29
Base 64 를 알아보자  (0) 2023.08.19