본문 바로가기
  • Hello_
Python/Image processing

[Python] 3D 배열 Resize하기 (skimage, scipy 활용)

by LDwDL 2023. 1. 10.
728x90
반응형

본 포스팅은 3D 형태의 배열을 사이즈 변경할 수 있는 라이브러리를 활용하여 각각 비교를 해볼 예정이다.

 

cv2 활용 불가한 경우

보통 2D 이미지의 크기를 변경할 때는 cv2를 많이 사용하지만 3D 형태의 이미지는 cv2를 활용할 수 없다.

물론 for loop을 활용하여 슬라이스 별로 하는 방법이 있지만 for loop의 기준이 되는 축의 크기는 변경할 수 없기 때문에 다른 라이브러리를 활용해야 한다.

 

3D 이미지 크기 변환은 크게 skimage 라이브러리의 resizescipy의 zoom을 사용할 수 있다.

 

skimage.transform.resize

skimage.transform.resize는 이미지 크기를 조정하는 데 사용하며 이미지와 원하는 출력 크기를 입력하면 크기가 조정된 배열을 반환한다.

 

참조 :  https://scikit-image.org/docs/stable/api/skimage.transform.html#skimage.transform.resize

 

크기를 변환하는 함수 특성상 'nearest', 'bilinear', 'bicubic' 등의 보관법을 사용하며 이미지 범위를 고정하거나 안티앨리어싱을 지원하는 함수이다.

 

from skimage import transform
import numpy as np

# 3차원 이미지 생성 // 크기: (10, 10, 10)
image = np.random.rand(10, 10, 10)

# (20, 20, 20)으로 resize
resized_image = transform.resize(image, (20, 20, 20))

print('image.shape: ', image.shape, 'resized_image.shape: ',  resized_image.shape)
# image.shape: (10, 10, 10) resized_image.shape: (20, 20, 20)

 

예시로 (10,10,10) 크기의 배열이 있고, 이를 resize함수에 변환하고자 하는 크기인 (20, 20, 20)를 함께 입력하면 크기가 변환된다.

 

scipy.ndimage.interpolation.zoom

scipy.ndimage.interpolation.zoom은 다차원 배열을 함수 이름과 같이 크기를 조정하는 데 사용되는 함수이다.

입력으로 출력하고자 하는 크기가 아닌 확대/축소 배율을 입력해야 하며, 그 배율대로 크기가 변경된 배열을 반환한다.

 

참조 :  https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.ndimage.interpolation.zoom.html

 

위 예시와 동일하지만 바뀐 점은 함수와 그 안에 입력되는 인자이다. 

 

from scipy.ndimage.interpolation import zoom
import numpy as np

# 3차원 이미지 생성 // 크기: (10, 10, 10)
image = np.random.rand(10, 10, 10)

# 2배 배율로 zoom
zoomed_image = zoom(image, 2, order=1)

print('image.shape: ', image.shape, 'zoomed_image.shape: ',  zoomed_image.shape)
image.shape: (10, 10, 10) zoomed_image.shape: (20, 20, 20)

 

resize와 다르게 zoom은 원하는 배율을 넣어주어야 한다.

 

만약 모든 축이 아니라 각 축의 배율을 지정하고 싶다면 축 별로 tuple로 구성하여 입력하면 된다.

 

resize vs zoom

 

두 개의 함수가 크게 다른 점은 없다. 다만 배율보다는 출력하고자 하는 배열의 크기를 넣어주는 것이 직관적이기 때문에 필자는 resize를 많이 사용하고 있다.

 

 

728x90
반응형

댓글