Letterboxing
레터박싱은 종횡비를 유지하면서 패딩을 추가해 이미지를 목표 크기로 조정하므로, 객체가 왜곡되지 않고 전체 시야가 보존됩니다.
레터박싱은 이미지의 종횡비를 유지하면서 패딩을 추가해 목표 크기에 맞추는 이미지 크기 조정 기법입니다. 이미지를 균일하게 확대 또는 축소한 다음, 남는 공간을 테두리 픽셀로 채워 객체의 비율과 전체 시야를 보존합니다. 컴퓨터 비전에서는 서로 다른 형태의 이미지를 공통 입력 형태를 허용하는 모델에 전달할 수 있도록 준비합니다.
AI 분야 밖에서 레터박싱은 와이드스크린 영화를 가로 막대와 함께 표시하는 방식을 가리키기도 합니다.
레터박싱으로 이미지의 기하 구조 보존하기#
종횡비는 이미지의 너비와 높이 사이의 관계입니다. 데이터 전처리 중 레터박싱은 두 배율, 즉 목표 너비를 원본 너비로 나눈 값과 목표 높이를 원본 높이로 나눈 값 중 작은 값을 선택합니다. 두 치수에 모두 해당 배율을 적용하므로 크기가 조정된 이미지가 목표 크기 안에 들어갑니다. 남은 픽셀은 패딩이 됩니다. TensorFlow의 크기 조정 및 패딩 작업은 이 방식을 0 값 테두리로 구현합니다.
예를 들어 1280 x 720 이미지를 640 x 640 목표 크기에 맞추면 배율은 0.5입니다. 이미지 콘텐츠는 640 x 360이 되며, 280행의 패딩이 남습니다. 이미지를 가운데에 배치하면 위아래에 각각 140행씩 추가됩니다. 세로형 이미지에는 좌우 테두리가 추가됩니다. 따라서 레터박싱된 이미지에는 가로 또는 세로 패딩이 있을 수 있으며, 목표 크기는 직사각형일 수도 있습니다.
Ultralytics YOLO는 탐지, 분할 및 포즈 입력의 기하 구조를 보존하기 위해 LetterBox 변환을 사용하며, 기본적으로 값이 114인 회색 패딩을 적용합니다. YOLO26의 탐지, 분할 및 포즈 예측에서는 최소 직사각형 패딩을 사용해, 배치 형태와 추론 백엔드가 지원하는 경우 테두리를 호환되는 스트라이드 배수까지 줄입니다.
레터박싱과 늘이기 및 자르기 비교#
이미지와 목표 크기가 일치하지 않을 때 적용할 수 있는 세 가지 크기 조정 방식은 각각 다르게 처리합니다.
- 레터박싱은 비율과 이미지 전체를 보존하며, 입력 공간의 일부를 패딩에 할당합니다.
- 늘이기는 너비와 높이를 각각 독립적으로 조정해 목표 크기를 채웁니다. 배율이 서로 다르면 원이 타원이 됩니다.
- 자르기는 균일한 크기 조정과 함께 적용할 경우 비율을 보존한 다음, 선택한 영역 바깥의 콘텐츠를 제거합니다. 이미지 가장자리 근처의 객체가 잘릴 수 있습니다.
이러한 선택은 형태와 위치가 중요한 객체 탐지와, 자르기로 인해 클래스의 가시적 근거가 달라지는 이미지 분류에 영향을 미칩니다.
패딩은 입력 영역도 차지합니다. 1280 x 720 예시에서 이미지 콘텐츠는 정사각형의 56.25%를 차지하고 패딩은 43.75%를 차지합니다. 다운샘플링하면 해당 콘텐츠 안의 미세한 세부 정보가 줄어들며, 테두리 픽셀을 추가해도 객체의 세부 정보가 늘어나지는 않습니다. 작은 객체가 포함된 고해상도 이미지의 경우 타일 추론으로 이미지 영역을 나누어 처리하면 객체의 유효 크기를 더 크게 할 수 있습니다.
Python 레터박싱 예제#
pip install pillow으로 Pillow를 설치합니다. Pillow의 ImageOps.pad 작업은 패딩된 캔버스에 이미지 크기를 조정해 가운데 배치합니다. 이 예제에서는 비전 튜토리얼용으로 배포되는 버스 사진을 사용합니다.
from urllib.request import urlretrieve
from PIL import Image, ImageOps
urlretrieve("https://ultralytics.com/images/bus.jpg", "bus.jpg")
image = Image.open("bus.jpg")
image = image.convert("RGB")
# Preserve proportions and fill the unused area with gray.
letterboxed = ImageOps.pad(image, (640, 640), color=(114, 114, 114))
letterboxed.save("letterboxed_bus.png")
print(f"{image.size} -> {letterboxed.size}")출력 크기는 (810, 1080) -> (640, 640)이며, 너비와 높이 순서로 표시됩니다. 저장된 이미지에는 480 x 640으로 크기를 조정한 사진 전체가 포함되며, 좌우에 각각 80픽셀의 테두리가 있습니다.
어노테이션과 예측 결과 매핑하기#
레터박싱은 픽셀뿐만 아니라 좌표계도 변환합니다. 모든 바운딩 박스 좌표는 크기를 조정하고 왼쪽 또는 위쪽 패딩만큼 이동해야 합니다. 포즈 추정의 키포인트와 인스턴스 분할의 객체 윤곽에도 동일한 기하 변환이 적용됩니다. 학습 중에 어노테이션을 그대로 두면 타깃과 해당 타깃이 설명하는 객체의 위치가 어긋납니다.
추론 후에는 좌표 재조정으로 변환을 되돌립니다. 패딩 오프셋을 뺀 다음 크기 조정 배율로 나눕니다. 패딩이 0이 아닌 경우 올바른 위치에 놓인 박스라도 오프셋을 적용하지 않으면 위치가 이동하고 정답과의 교집합 대 합집합이 감소합니다. 버스 예시에서 패딩된 좌표 (320, 320)의 점은 x에서 80을 빼고 두 좌표를 모두 640 / 1080으로 나눈 후 원본 좌표 (405, 540)에 매핑됩니다.










