퐈니썬's LIfe - 잘 실패하자 RSS 태그 관리 글쓰기 방명록
Programming (11)
2021-06-25 15:31:11
728x90
반응형

01. 서문

최근에 DICOM 이미지를 축대칭을 하는 과정에서 numpy의 flip 메소드를 편하게 사용하여 작성합니다. 물론, 일반 이미지의 경우, cv2의 flip기능을 사용해도 편합니다.

다만, DICOM 의 array만 받아서 처리할때 배열을 다루는 numpy 함수를 사용했던 것을 메모차 작성합니다.

도움이 된다면 좋겠습니다.

02. 이미지 축 대칭

대칭에는 여러가지가 있지만, 본 포스트에서는 "반사대칭" 즉, 차원에 대한 대칭에 대해 다루었습니다.

2 차원에는 대칭축 (일명 대칭 선)이 있고 3 차원에는 대칭 평면이 있습니다.

모든 점에 대해 공통 평면의 반대편에서 등거리에있는 다른 점과 일대일 매핑이있는 객체 또는 그림을 대칭 대칭이라고합니다.

03. numpy flip

numpy의 문서를 보면 numpy flip은 다음과 같이 설명되어 있습니다.

 

flip 메소드는 배열의 원소들의 순서를 재배치 해주는 역할인것이고, 배열(array)을 입력으로 출력 또한 배열형태 이고, axis라는 옵션에 따라서 차원이 정해집니다.

예시.

>>> A = np.arange(10).reshape(2,5)
>>> print(A)
[[0 1 2 3 4]
 [5 6 7 8 9]]

>>>print(np.flip(A,0))
[[5 6 7 8 9]
 [0 1 2 3 4]]

>>>print(np.flip(A,1))
[[4 3 2 1 0]
 [9 8 7 6 5]]

위 와 같이 axis가 0, 1에 따라 위와 아래가 바뀌던지 원소들의 배열이 바뀐다던지 등의 차원 반전이 생깁니다. axis는 차원에 따라 최대 숫자가 늘어납니다.

 

04. numpy flip을 활용한 이미지 축 대칭 시키기

이를 통해서 이미지를 반전시키는 것이 가능한데요, 최근에 DICOM 이미지를 통해 변환한 경험으로, 오픈 DICOM 데이터인 "Digimouse"를 사용해보았습니다.

주로 사용하시는 DICOM형태는 아니고, nifty 파일 형식으로 되어 있는 이미지 파일이지만, DICOM 또한 pydicom으로 array를 출력하면 동일하게 적용됩니다. 

 

DICOM 오픈이미지; Digimouse

https://neuroimage.usc.edu/neuro/Digimouse_Download

 

Digimouse_Download - Biomedical Imaging Group"

Digimouse_Download (2012-02-12 07:26:42에 cpe-76-170-79-250가(이) 마지막으로 수정)

neuroimage.usc.edu

여기서 Atlas 데이터를 변형 해보았습니다.

4.1 R-L 대칭

좌: 원본

우: 변환본

4.2 A-P 대칭

좌: 원본

우: 변환본

4.3 I-S 대칭

좌: 원본

우: 변환본

위 와 같이 axis가 0, 1에 따라 위와 아래가 바뀌던지 원소들의 배열이 바뀐다던지 등의 차원 반전이 생깁니다. axis는 차원에 따라 최대 숫자가 늘어납니다.

5. 작성코드

import nibabel as nib
import numpy as np
# ctfn = '/home/hwan/code/study/04.DICOM/nibabel/ct_380x992x208.nii'
niifn = '/home/hwan/code/study/04.DICOM/nibabel/nii/atlas_380x992x208.nii'


proxy = nib.load(niifn)
data = proxy.get_fdata()
array = data.view(type=np.ndarray)
# np.flip(array,0) -> 좌우대칭 RL
# np.flip(array,1) -> 앞뒤대칭 AP 
# np.flip(array,2) -> 상하대칭 IS
array_flip = np.flip(array,2)
aff = proxy.affine
hdr = proxy.header

zflip = nib.Nifti1Image(array_flip,aff, hdr)
nib.save(zflip, './ISflip_atlas_380x992x208.nii')
728x90
반응형

'Programming > Python' 카테고리의 다른 글

파이썬 *arg 와 **kwargs 이해 하기  (0) 2022.03.11
파이썬 f-string  (0) 2021.12.31
파이썬 모듈이란? 패키지란?  (0) 2021.07.01
파이썬 PEP8 스타일 가이드 정리  (0) 2021.07.01
파이썬 클래스 상속  (0) 2021.06.28