본 포스팅은 3D 형태의 배열을 사이즈 변경할 수 있는 라이브러리를 활용하여 각각 비교를 해볼 예정이다.
cv2 활용 불가한 경우
보통 2D 이미지의 크기를 변경할 때는 cv2를 많이 사용하지만 3D 형태의 이미지는 cv2를 활용할 수 없다.
물론 for loop을 활용하여 슬라이스 별로 하는 방법이 있지만 for loop의 기준이 되는 축의 크기는 변경할 수 없기 때문에 다른 라이브러리를 활용해야 한다.
3D 이미지 크기 변환은 크게 skimage 라이브러리의 resize와 scipy의 zoom을 사용할 수 있다.
skimage.transform.resize
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은 다차원 배열을 함수 이름과 같이 크기를 조정하는 데 사용되는 함수이다.
입력으로 출력하고자 하는 크기가 아닌 확대/축소 배율을 입력해야 하며, 그 배율대로 크기가 변경된 배열을 반환한다.
위 예시와 동일하지만 바뀐 점은 함수와 그 안에 입력되는 인자이다.
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를 많이 사용하고 있다.
'Python > Image processing' 카테고리의 다른 글
[Python] Image filtering - 영상처리에 대해 (0) | 2022.09.26 |
---|---|
[Python] Morophological 구현 (모폴로지 연산 그림으로 설명) (0) | 2022.08.30 |
댓글