안녕하세요. 이번 글에서는 python opencv에서 이미지의 크기를 변경할 때,
resize 시 적용되는 보간 방법들에 대하여 간략하게 요약해보도록 하겠습니다.
보간(Interpolation) 이란?
이미지 크기를 변경하면 원본의 특성을 최대한 유지하면서 픽셀의 값을 다시 계산해야 합니다.
이때, 주변 픽셀 값을 이용해 새로운 값을 추정하는 과정이 바로 보간입니다.
cv2.resize 함수로 이미지의 해상도를 쉽게 변경할 수 있는데요.
opencv에서는 크게 5가지 정도의 보간 방법을 제공하고 있습니다.
- cv2.INTER_NEAREST - 최근접 이웃
- cv2.INTER_LINEAR - 선형 보간 (기본값)
- cv2.INTER_CUBIC - 3차 보간
- cv2.INTER_AREA - 영역 보간
- cv2.INTER_LANCZOS4 - Lanczos 보간
이제부터 예시를 통하여 각 보간 방법의 이해를 해보도록 하겠습니다.
이미지 확대 예시
import numpy as np
import cv2
# 원본 2x2 이미지
img = np.array([[10, 20],
[30, 40]], dtype=np.uint8)
# 각 방법으로 6x6 확대
nearest = cv2.resize(img, (6, 6), interpolation=cv2.INTER_NEAREST)
linear = cv2.resize(img, (6, 6), interpolation=cv2.INTER_LINEAR)
cubic = cv2.resize(img, (6, 6), interpolation=cv2.INTER_CUBIC)
area = cv2.resize(img, (6, 6), interpolation=cv2.INTER_AREA)
lanczos = cv2.resize(img, (6, 6), interpolation=cv2.INTER_LANCZOS4)
print("\nNEAREST:\n", nearest)
print("\nLINEAR:\n", linear)
print("\nCUBIC:\n", cubic)
print("\nAREA:\n", area)
print("\nLANCZOS:\n", lanczos)
위의 코드를 실행하면, 2x2 -> 6x6으로 업스케일한 결과의 예시를 쉽게 비교할 수 있습니다.
Nearest 방식은 가장 가까운 픽셀을 복사하는 가장 간단한 방식입니다.
NEAREST:
[[10 10 10 20 20 20]
[10 10 10 20 20 20]
[10 10 10 20 20 20]
[30 30 30 40 40 40]
[30 30 30 40 40 40]
[30 30 30 40 40 40]]
Linear 방식은 주변 2x2 픽셀을 가중 평균내는 비교적 간단한 방식입니다.
LINEAR:
[[10 10 13 17 20 20]
[10 10 13 17 20 20]
[17 17 20 23 27 27]
[23 23 26 30 33 33]
[30 30 33 37 40 40]
[30 30 33 36 40 40]]
Cubic 방식은 주변 4x4 픽셀을 기준으로 3차 함수로 보간하는 복잡도가 있는 방식입니다.
CUBIC:
[[ 7 8 11 15 18 19]
[ 9 10 13 17 20 21]
[15 16 19 23 26 27]
[23 24 27 31 34 35]
[29 30 33 37 40 41]
[31 32 35 39 42 43]]
Area 방식은 확대에서는 Nearest와 동일합니다.
축소에서 강점을 보이는데 상세한 원리는 뒷 파트에서 설명하겠습니다.
AREA:
[[10 10 10 20 20 20]
[10 10 10 20 20 20]
[10 10 10 20 20 20]
[30 30 30 40 40 40]
[30 30 30 40 40 40]
[30 30 30 40 40 40]]
Lanczos 방식은 8x8 픽셀 범위를 전부 참조하여 복잡한 Lanczos sinc 함수로
보간하는 가장 복잡한 방식입니다. 출력 값은 다음과 같습니다.
LANCZOS:
[[ 6 8 11 14 18 19]
[ 9 10 13 17 20 21]
[15 16 19 23 26 27]
[23 24 27 31 34 35]
[29 30 33 37 40 41]
[31 32 36 39 42 44]]
이미지 축소 예시
import numpy as np
import cv2
# 원본 6x6 이미지
img = np.array([[10, 30, 50, 70, 90, 110],
[20, 40, 60, 80, 100, 120],
[30, 50, 70, 90, 110, 130],
[40, 60, 80, 100, 120, 140],
[50, 70, 90, 110, 130, 150],
[60, 80, 100, 120, 140, 160]], dtype=np.uint8)
# 각 방법으로 3x3 축소
nearest = cv2.resize(img, (3, 3), interpolation=cv2.INTER_NEAREST)
linear = cv2.resize(img, (3, 3), interpolation=cv2.INTER_LINEAR)
cubic = cv2.resize(img, (3, 3), interpolation=cv2.INTER_CUBIC)
area = cv2.resize(img, (3, 3), interpolation=cv2.INTER_AREA)
lanczos = cv2.resize(img, (3, 3), interpolation=cv2.INTER_LANCZOS4)
print("\nNEAREST:\n", nearest)
print("\nLINEAR:\n", linear)
print("\nCUBIC:\n", cubic)
print("\nAREA:\n", area)
print("\nLANCZOS:\n", lanczos)
위에 대한 보간 결과는 다음과 같습니다.
NEAREST:
[[ 10 50 90]
[ 30 70 110]
[ 50 90 130]]
LINEAR:
[[ 25 65 105]
[ 45 85 125]
[ 65 105 145]]
CUBIC:
[[ 22 64 106]
[ 43 85 127]
[ 64 106 148]]
AREA:
[[ 25 65 105]
[ 45 85 125]
[ 65 105 145]]
LANCZOS:
[[ 22 64 106]
[ 43 85 126]
[ 64 106 147]]
여기서 AREA 방식은 모든 픽셀 구간을 순회하며, 각 픽셀이 실제로 대응되는 영역에 대한
가중 평균을 구하는 로직을 사용합니다.
이 방식은 축소 시에도 원본의 특징을 비교적 잘 보존하는 것으로 알려져 있습니다.
보간 방법 특징 비교
이제 각 보간 방법들에 대한 특징을 표로 비교하면 다음과 같습니다.
| 보간 방법 | 참조 픽셀 | 계산량 | 품질 | 요약 |
| NEAREST | 1×1 (1개) | O(1) | 하 | 빠르나 품질이 낮음 |
| LINEAR | 2×2 (4개) | O(4) | 중 | 비교적 널리 쓰임 |
| CUBIC | 4×4 (16개) | O(16) | 상 | 고품질 확대 |
| AREA | 가변 | O(n²) | 확대(하), 축소(최상) | 축소 최적 |
| LANCZOS4 | 8×8 (64개) | O(64) | 최상 | 최고 품질 |
이 글이 opencv의 주요 interpolation 방법을 비교하는 데에 도움이 되셨기를 바라겠습니다.
감사합니다.
'Python > Vision Code' 카테고리의 다른 글
| [OpenCV, Pillow] 이미지 저장 과정에서 색감 정보 보존 방법(크로마, icc profile 보존) (0) | 2025.11.26 |
|---|---|
| [OpenCV] 아핀 변환 함수 cv2.warpAffine 예제로 사용법 알아보기 (0) | 2025.10.19 |
| insightface FaceAnalysis로 얼굴 추출 및 정보 분석 예제 (0) | 2025.10.12 |