Numpy를 이용한 이미지 크기 조절 및 리스케일링
Numpy를 이용한 이미지 크기 조절 및 리스케일링
Numpy 배열로 이미지 로드하기
먼저, PIL 또는 OpenCV와 같은 이미지 처리 라이브러리를 사용하여 이미지를 Numpy 배열로 로드해야 합니다.
import numpy as np
from PIL import Image
# 이미지 로드
img = Image.open('image.png')
# 이미지를 Numpy 배열로 변환
img_arr = np.array(img)
Numpy resize 함수 사용
Numpy resize
함수를 사용하여 이미지 크기를 조절할 수 있습니다. resize
함수는 다음과 같은 인자를 받습니다.
img_arr
: 크기 조절할 이미지 Numpy 배열new_shape
: 원하는 이미지 크기 (튜플 형태)
# 이미지 크기 조절 (200x200)
new_arr = np.resize(img_arr, (200, 200))
리스케일링
resize
함수는 단순히 이미지 크기를 변경하며, 픽셀 값은 보간하지 않습니다. 리스케일링을 위해서는 interpolation
인자를 사용해야 합니다. 일반적인 보간 방법은 다음과 같습니다.
nearest
: 가장 가까운 픽셀 값 사용bilinear
: 주변 픽셀 값 평균 사용bicubic
: 주변 픽셀 값 가중 평균 사용
# 리스케일링 (200x200, bilinear 보간)
new_arr = np.resize(img_arr, (200, 200), interpolation='bilinear')
이미지 저장
Numpy 배열을 다시 이미지 파일로 저장하려면 PIL 또는 OpenCV를 사용할 수 있습니다.
# 이미지 저장
new_img = Image.fromarray(new_arr)
new_img.save('resized_image.png')
참고:
- Numpy
resize
함수는 이미지 크기 조절 및 리스케일링에 간편한 방법을 제공합니다. - 보다 정교한 이미지 처리를 위해서는 OpenCV 또는 Scikit-Image와 같은 라이브러리를 사용하는 것이 좋습니다.
- Numpy
resize
함수는 이미지 데이터를 복사하기 때문에 메모리 사용량이 증가할 수 있습니다.
예제 코드
import numpy as np
from PIL import Image
# 이미지 로드
img = Image.open('image.png')
# 이미지 크기 조절 (200x200)
new_arr = np.resize(img, (200, 200))
# 리스케일링 (200x200, bilinear 보간)
new_arr = np.resize(img, (200, 200), interpolation='bilinear')
# 이미지 저장
new_img = Image.fromarray(new_arr)
new_img.save('resized_image.png')
- 위 코드는 예시이며, 실제 사용 환경에 맞게 수정해야 합니다.
- 이미지 파일 형식에 따라
Image.open
함수의 인자를 변경해야 할 수도 있습니다.
Numpy resize/rescale 이미지 대체 방법
OpenCV 이용
OpenCV는 컴퓨터 비전 분야에서 널리 사용되는 라이브러리이며, 다양한 이미지 처리 기능을 제공합니다. OpenCV를 이용하여 이미지 크기 조절 및 리스케일링을 수행하는 방법은 다음과 같습니다.
import cv2
# 이미지 로드
img = cv2.imread('image.png')
# 이미지 크기 조절 (200x200)
new_img = cv2.resize(img, (200, 200))
# 리스케일링 (200x200, bilinear 보간)
new_img = cv2.resize(img, (200, 200), interpolation=cv2.INTER_LINEAR)
# 이미지 저장
cv2.imwrite('resized_image.png', new_img)
Scikit-Image 이용
Scikit-Image는 Python에서 이미지 처리를 위한 강력한 라이브러리입니다. Scikit-Image를 이용하여 이미지 크기 조절 및 리스케일링을 수행하는 방법은 다음과 같습니다.
from skimage import transform
# 이미지 로드
img = imread('image.png')
# 이미지 크기 조절 (200x200)
new_img = transform.resize(img, (200, 200))
# 리스케일링 (200x200, bilinear 보간)
new_img = transform.resize(img, (200, 200), mode='constant')
# 이미지 저장
imsave('resized_image.png', new_img)
Pillow 이용
from PIL import Image
# 이미지 로드
img = Image.open('image.png')
# 이미지 크기 조절 (200x200)
new_img = img.resize((200, 200))
# 리스케일링 (200x200, bilinear 보간)
new_img = img.resize((200, 200), Image.BILINEAR)
# 이미지 저장
new_img.save('resized_image.png')
각 방법의 장단점:
- Numpy resize/rescale: 간편하지만, 리스케일링 시 품질 저하가 발생할 수 있음
- OpenCV: 다양한 이미지 처리 기능 제공, 컴퓨터 비전 분야에 적합
- Scikit-Image: SciPy 기반, 과학적 컴퓨팅 및 이미지 처리에 적합
- Pillow: 간편하고 빠르지만, 기능 제한적
python image numpy