의료용 이미지와 애플리케이션을 다룰 때 발생하는 문제 중 하나는 좌표계 간의 차이이다.
이미징 애플리케이션에서 일반적으로 사용되는 좌표계는 세계 좌표계, 해부 좌표계, 이미지 좌표계 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 |