영상 리사이징 (Image Resizing)
- 영상의 해상도(Resolution)를 변경하는 과정으로, 원하는 해상도로 영상의 크기를 조정하고 그에 따라 픽셀의 수가 늘어나거나 줄어든다.
- 이러한 과정은 2D-Sampling 이라 할 수 있으며, 영상 크기를 늘리는 것을 업샘플링(Up-Sampling), 줄이는 것을 다운샘플링(Down-Sampling) 이라 한다.
Down-sampling
- 이미지 축소, 원본의 세부 정보가 손실될 수 있으므로 정보의 손실을 최소화하는 것이 중요함.
- 단순히 픽셀을 제거하는 방식으로 다운샘플링하면 디테일이 손실되고, 계단 현상(aliasing)이 발생할 수 있다.
- 주요 알고리즘: Nearest Neighbor, Bilinear, Bicubic, Area Averaging 등
Up-sampling
- 이미지 확대, 새로운 픽셀을 생성해야 하며 단순히 픽셀을 복제하는 방식으로 업샘플링하면 이미지가 흐릿해지거나 계단 현상(aliasing)이 발생할 수 있으므로 보간법(Interpolation)이 중요함.
- 이미지에 없던 정보를 생성하지 않으므로, 원본 이미지의 품질이 낮으면 업샘플링 결과도 좋지 않다.
- 주요 알고리즘 : Nearest Neighbor, Bilinear, Bicubic, Lanczos 등
- 최근 딥러닝 모델을 사용하여 이미지 업샘플링을 수행하는 Super-Resolution 방법이 다양하게 연구되고 있으며, 저해상도 이미지에서 고해상도 이미지를 생성하는 방법을 학습하여 기존의 보간법보다 훨씬 더 선명하고 디테일한 이미지를 얻을 수 있다.
리샘플링 및 보간법 (Resampling, Interpolation)
- 영상 리사이징에서 사용되는 주요 방법으로, 다운샘플링을 할 때에는 여러 픽셀을 하나의 대표 픽셀로 줄이는 리샘플링(Resampling) 방법이 사용되고, 업샘플링 과정에서는 주어진 이산 데이터 사이의 값을 추정하는 보간(Interpolation) 방법이 사용된다.
- OpenCV의
risize()
함수에서는 업/다운 여부를 따지지 않고 보간법 파라미터를 요구하며, 보간이라는 용어를 포괄적으로 사용하는 것이 일반화 되어 있다.
Nearest-Neighbor Interpolation
- 최근접 이웃 보간(Nearest Neighbor) 방법으로, 가장 가까운 픽셀값을 그대로 사용하는 방식.
- 가장 간단하고 빠르지만, 결과 이미지의 품질이 떨어짐. 업샘플링과 다운샘플링 모두 동일하게 동작한다.
- 만약 x, y를 각각 2배 확대한다면, 확대된 이미지의 픽셀 의 픽셀값은 다음과 같이 계산된다.
- ,
- 따라서,
- 즉 , 확대된 이미지의 (3, 5) 픽셀값은 원본 이미지의 (2,3) 픽셀값으로 매핑된다.
Bilinear Interpolation
- 양선형 보간(Bilinear) 방법은 x축과 y축으로 두 번 선형보간을 적용한다. 입력 이미지의 4개의 인접 픽셀을 사용하여 선형적으로 보간한다.
- Nearest Neighbor 방법보다 부드러운 결과를 제공하며, Bicubic 보간보다는 계산 비용이 적다.
- OpenCV
resize()
함수의 기본값이며, 업샘플링에서 자주 사용된다.
- 위 그림은 원본 이미지를 3배 업샘플링한다고 가정했을 때, 업샘플링된 이미지를 나타낸 것.
- 파란색 P1~P4의 네개 점은 3배 늘어난 픽셀 위치에 원본 픽셀값이 매핑된 것이며, 흰색 영역이 보간법을 이용해 새로운 값의 지정이 필요한 위치이다.
1. 주변 4개 픽셀 설정
- 확대/축소된 이미지의 목표 위치 를 기준으로 원본 이미지에서 주변 4개 픽셀을 찾음.
- 위 그림에서 별 표시가 있는 픽셀이 타겟이라고 할 때, 원본 이미지에 존재하는 주변 4개의 픽셀(P1, P2, P3, P4)을 찾아 보간을 위해 참조할 값으로 지정할 수 있다.
- 예시) 3배 업샘플링한 이미지에서 좌표에 해당하는 4개의 주변좌표를 구한다면,
- ,
2. 가중치 계산
- 선형 보간을 위해 각 위치에 대한 가중치를 계산한다. 가중치는 목표 위치와 각 픽셀 사이의 거리에 반비례한다.
- 예시) 3배 업샘플링한 이미지에서 좌표에 해당하는 참조좌표 의 가중치를 계산해보면,
- 이는, 는 각각 목표 위치의 픽셀이 축으로 0.666 만큼 떨어져 있고, 축으로 0.333 만큼 떨어져 있다라고 해석할 수 있다.
3. 보간 및 픽셀값 계산
- 가중치를 이용하여 축과 축으로 선형 보간을 통해 목표 위치의 픽셀값을 구할 수 있다.
- 과 를 를 이용해 축으로 선형 보간하여 위 그림의 위치에 해당하는 값을 구함.
- 과 를 를 이용해 축으로 선형 보간하여 위 그림의 위치에 해당하는 값을 구함.
- 와 를 를 이용해 축으로 선형보간하여 목표 위치에 해당하는 값을 구함.
- 예시) 이라 할때, 좌표에 해당하는 픽셀값을 계산해보면,
- 따라서, 목표 좌표의 픽셀값은 약 127로 계산됨.
Code (Python)
Resize_Using_Bilinear_Interpolation
import numpy as np import cv2 def bilinear_resize_gray(img, new_height, new_width): original_height, original_width = img.shape resized = np.zeros((new_height, new_width), dtype=np.uint8) scale_x = original_width / new_width scale_y = original_height / new_height for y in range(new_height): for x in range(new_width): src_x = x * scale_x src_y = y * scale_y x0 = int(np.floor(src_x)) x1 = min(x0 + 1, original_width - 1) y0 = int(np.floor(src_y)) dx = src_x - x0 dy = src_y - y0 # X축 Top 선형보간 top = (1 - dx) * img[y0, x0] + dx * img[y0, x1] # X축 Bottom 선형보간 bottom = (1 - dx) * img[y1, x0] + dx * img[y1, x1] # Y축 선형보간 value = (1 - dy) * top + dy * bottom resized[y, x] = np.clip(value, 0, 255) return resized
Bicubic interpolation
- Bicubic 보간 방법은 주변 16개(4x4)의 픽셀값을 이용한 3차 함수 보간을 수행한다.
- 업샘플링 시 Bilinear 방법보다 더 부드럽고 자연스러운 결과를 제공하지만 계산 비용이 높다.
1. 주변 16개 픽셀 설정
- 확대/축소된 이미지의 목표 위치 를 기준으로 원본 이미지에서 보간에 필요한 16개의 인접 픽셀(4x4 영역)을 설정한다.
- 예시) 2배 업샘플링한 이미지에서 좌표에 해당하는 참조좌표 를 설정해보면,
- 참조픽셀은 부터 까지 16개
2. 1차원 Cubic 보간식(가중 함수)
- Bicubic은 1차원 cubic 보간을 x방향과 y방향에 각각 적용하는 구조다.
- 일반적으로 다음과 같은 3차 함수를 가중 함수(weighting function)로 사용하며, 이 함수는 픽셀 간의 거리에 따라 가중치를 결정한다.
- : 입력. 픽셀 간의 거리.
- : 매개변수. 일반적으로 -0.5 또는 -0.75 값을 가지며 이미지의 선명도에 영향을 미침. (OpenCV 에서는 -0.5)
3. 2차원 Bicubic 보간 과정
- 가중 함수를 이용해 각 픽셀에 대한 가중치를 계산하며, 가중치는 목표 위치와 각 픽셀 사이의 거리를 가중 함수에 적용한다.
- x축 방향 4줄에 대한 cubic 보간을 수행 → 중간 값 4개 생성
- 그 4개의 중간 값에 대해 y방향 cubic 보간 수행 → 최종 보간 값 생성
- 가중치 계산 :
- 보간된 픽셀값 계산 :
Lanczos interpolation
- Lanczos 보간은 sinc 함수를 기반으로 하는 Lanczos 커널을 사용하여 주변 픽셀의 가중치를 계산하고, 이를 통해 새로운 픽셀 값을 추정한다.
- 고급 보간 방법 중 하나로, Bicubic보다 더 나은 결과를 제공할 수 있으나 계산 비용이 높다.
1. 1차원 Lanczos Kernel
- Lanczos 커널은 다음과 같이 정의된다.
- 여기서,
- : 커널 크기를 나타내는 정수
- 일반적으로 2또는 3, OpenCV 에서는 4 사용 (커널반경 8픽셀 - 좌우 각각 4픽셀 범위에서 샘플)
2. 주변 픽셀 범위 설정
- 목표 위치 에 대해 Lanczos 커널 크기 에 따라 픽셀 범위를 설정함.
3. 가중치 계산
- 각 주변 픽셀에 대해 목표 위치와 각 픽셀 사이의 거리를 Lanczos 커널에 적용하여 가중치를 계산함.
4. 보간 픽셀값 계산
- 주변 픽셀값과 해당 가중치를 사용하여 보간된 목표 위치의 픽셀값을 계산함.
- Lanczos의 특징으로 고주파 성분 보존이 잘 됨 → 선명하고 디테일이 살아있음.
- 특히 고대비 경계에서 ringing(진동 패턴) 발생 가능.
Resampling using pixel area Average
- 픽셀 영역 평균 보간법은 특히 다운샘플링(축소) 시 좋은 품질을 제공하는 방법이다.
- 축소 시 대상 픽셀 하나는 원본 이미지에서 더 넓은 영역을 커버하게 되므로, 해당 영역에 걸친 모든 원본 픽셀 값을 가중 평균하여 새로운 픽셀 값을 결정함.
- : 출력 픽셀에 대응되는 원본 이미지의 영역
- : 영역 내의 픽셀 수
OpenCV Resize
- OpenCV의
risize()
함수에서 사용되는 보간법의 종류 및 특징.
파라미터 | 설명 | 용도 |
---|---|---|
cv2.INTER_NEAREST | 최근접 이웃 보간 | 라벨 이미지, 속도 중요할 때 |
cv2.INTER_LINEAR | 양선형 보간 (기본값) | 일반적인 업샘플링/다운샘플링 |
cv2.INTER_CUBIC | 양삼차 보간 (4x4 픽셀 사용) | 고품질 업샘플링, 느림 |
cv2.INTER_LANCZOS4 | Lanczos 보간 (8x8 픽셀 사용) | 매우 고품질 업샘플링, 느림 |
cv2.INTER_AREA | 픽셀 영역 평균 기반 보간 | 다운샘플링에 추천됨 |
- 업샘플링에서
INTER_AREA
를 사용하면 OpenCV에서 내부적으로INTER_LINEAR
로 대체 된다.
Prev: 3. 영상 히스토그램
Next: 5. 영상 필터링