아마도 놓치고 있는 전처리 단계 (그리고 모델이 그 대가를 치르는 이유)

발행: (2026년 2월 21일 오전 01:13 GMT+9)
11 분 소요
원문: Dev.to

Source: Dev.to

Source:

문제 이해

  • Grayscale image: 0(검정)부터 255(흰색)까지의 픽셀 강도 값을 갖는 2‑D 격자.
  • Color image: 이러한 격자를 세 개 쌓아 만든 형태(예: BGR 또는 RGB).

모델이 이미지를 볼 때, 보는 것은 바로 이 숫자들뿐이며—그 외는 전혀 없습니다.

조명이 어두운 방 안에서 사진을 찍었다고 상상해 보세요. 대부분의 픽셀 값이 0 – 80 범위에 모여 있습니다. 모델이 필요로 하는 밝은 영역, 질감, 세부 사항은 모두 낮은 강도 값의 좁은 구간에 압축되어 있습니다. 인간 눈에는 이미지가 어둡게 보이지만, 모델 입장에서는 관련 특징이 거의 동일한 숫자라 구분하기 어렵습니다.

이는 드문 예외 상황이 아닙니다. 지속적으로 발생합니다:

  • 관심 영역이 주변 조직에 비해 대비가 낮은 의료 스캔.
  • 창고 조명이 일정하지 않아 촬영된 생산 라인상의 과일.
  • 황혼에 대시캠으로 촬영된 도로.
  • 대기 흐림이 있는 위성 이미지.

모델이 실패하는 이유는 모델 자체가 약해서가 아니라, 입력이 공정한 기회를 제공하지 못했기 때문입니다.

고전적인 해결책: 히스토그램 평활화

히스토그램 평활화는 좁은 범위에 몰려 있는 픽셀 값을 전체 0 – 255 범위로 퍼뜨려 대비를 높이고 미묘한 차이를 더 두드러지게 합니다.

장점: 단순하고 균일한 이미지에 잘 작동합니다.

단점: 각 픽셀에 단일 변환을 적용하여 지역적 맥락을 무시합니다.

한쪽은 매우 밝고(과다 노출된 하늘) 다른 쪽은 매우 어두운(그늘진 피사체) 이미지가 있다고 가정해 보세요. 밝은 픽셀이 히스토그램을 지배하므로 변환이 밝은 영역에 최적화됩니다. 대비가 더 필요했던 어두운 영역은 거의 혜택을 받지 못하고, 반대로 밝은 영역은 부자연스럽게 과도하게 밝아질 수 있습니다.

A Better Approach: CLAHE

CLAHE = Contrast Limited Adaptive Histogram Equalization

ComponentWhat it does
Adaptive이미지를 작은 직사각형 타일 로 나누고 각 타일마다 별도의 히스토그램을 계산합니다. 각 영역은 해당 지역 픽셀 분포에 기반한 자체적인 대비 보정을 받습니다.
Contrast Limited평활화하기 전에 각 타일의 히스토그램을 설정된 임계값으로 클리핑합니다. 초과된 카운트는 균일하게 재분배되어 저디테일 영역에서 잡음 증폭을 방지합니다.
Bilinear Interpolation각 타일을 처리한 후, CLAHE는 타일 경계들을 부드럽게 블렌딩하여 눈에 띄는 격자 패턴이 나타나지 않게 합니다.

그 결과 의미 있게 향상된 지역 대비, 제어된 잡음, 그리고 거친 경계가 없는 이미지가 얻어집니다.

Real‑World Example

바나나 숙도 분류기를 만들 때, 학습 이미지들은 밝은 햇빛, 노란 주방 조명, 어두운 보관 구역 등 여러 출처에서 왔습니다. 픽셀 분포가 매우 일관되지 않았습니다.

  • 전처리 없이: 모델은 조명이 좋은 이미지에서는 잘 작동했지만 어두운 이미지에서는 성능이 떨어졌으며, 사실상 조명 조건을 외우고 있었습니다.
  • CLAHE 적용 후: 모든 이미지에서 지역 대비가 정규화되어, 원래 조명과 관계없이 시각적 특징(텍스처, 색상 패턴)이 일관되게 유지되었습니다. 모델은 밝기 아티팩트가 아니라 숙도 신호에 집중할 수 있었고, 그 결과 지표가 개선되고 실제 환경에서도 더 견고하게 동작했습니다.

전체 프로젝트는 여기에서 확인할 수 있습니다: BananaClock on GitHub

OpenCV에서 CLAHE 사용

OpenCV를 사용하면 매우 간단합니다. 아래 예시는 LAB 색 공간에서 L 채널에만 CLAHE를 적용하여 색 정보를 보존하는 최소 구현 예시입니다.

import cv2
import numpy as np

# Load image
image = cv2.imread("your_image.jpg")

# Convert to LAB color space
lab = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)

# Split the LAB image into its channels
l_channel, a_channel, b_channel = cv2.split(lab)

# Create a CLAHE object (clipLimit=2.0, tileGridSize=(8, 8) are common defaults)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))

# Apply CLAHE to the L channel only
l_clahe = clahe.apply(l_channel)

# Merge the CLAHE‑enhanced L channel back with the original A and B channels
lab_clahe = cv2.merge((l_clahe, a_channel, b_channel))

# Convert back to BGR color space
final_image = cv2.cvtColor(lab_clahe, cv2.COLOR_LAB2BGR)

# Save or display the result
cv2.imwrite("your_image_clahe.jpg", final_image)
# cv2.imshow("CLAHE Result", final_image)
# cv2.waitKey(0)
# cv2.destroyAllWindows()

  • clipLimit 값을 조정하여 노이즈 제한 정도를 제어합니다 (값이 낮을수록 노이즈 증폭이 적음).
  • tileGridSize 를 변경하면 로컬 영역의 크기를 조절할 수 있습니다 (타일이 작을수록 보다 국부적인 대비 향상).
  • 흑백 이미지의 경우 LAB 변환 없이 단일 채널에 바로 CLAHE를 적용할 수 있습니다.

CLAHE 사용에 대한 핵심 포인트

  • LAB에서 작업하고, BGR이 아니라

    • CLAHE를 BGR에 직접 적용하지 말고, LAB의 L 채널에 적용하십시오.
    • LAB는 밝기(L)와 색상(A, B)을 분리하여 현실적인 색상을 유지합니다.
  • clipLimit 매개변수

    • 히스토그램 클리핑 강도를 제어합니다.
    • 일반적인 범위: 2.0 – 4.0; 기본값 2.0이 잘 작동합니다.
  • tileGridSize 매개변수

    • 이미지를 몇 개의 타일로 나눌지 결정합니다.
    • 중간 해상도 이미지의 경우 8×8 그리드가 좋은 기본값이며, 매우 고해상도 또는 저해상도 입력에 맞게 조정하십시오.

CLAHE가 유용한 경우

  • 훈련 데이터의 조명 불균형.
  • 제어되지 않은 환경(모바일, 야외, 산업)에서의 배포.
  • 저대비 영역: 의료 영상, 위성 영상 등.
  • 그림자 디테일 복구가 필요한 저조도 작업.

CLAHE가 덜 유용할 때

  • 이미지는 이미 적절하게 노출되고 일관되어 있다.
  • CLAHE를 추가하면 의미 있는 이점 없이 처리 오버헤드가 증가한다.
  • 매우 높은 clipLimit은 자연스럽게 매끄러운 영역에 인공적인 텍스처를 만들 수 있다.

왜 전처리가 중요한가

전처리를 “지루한” 단계로 여기고 대신 아키텍처, 학습 루프, 손실 함수에 집중하는 경향이 있습니다. 이러한 사고방식은 비용이 많이 들 수 있습니다:

  • 모델은 받는 데이터를 학습합니다.
  • 잡음이 많거나 일관성이 없으며 표현이 부실한 입력은 아키텍처 복잡성으로 보완할 수 없습니다.
  • 전처리(리사이징, 정규화, 대비 향상)는 모델 성능에 직접적인 영향을 미치는 중요한 단계입니다.

CLAHE는 더 넓은 원칙의 한 예일 뿐입니다: 입력 데이터의 품질이 출력 품질에 직접적이고 종종 과소평가되는 영향을 미칩니다. 이미지의 수치적 특성—분포, 대비, 다이내믹 레인지—을 이해하는 것은 견고한 컴퓨터 비전 시스템을 구축하는 일환입니다.

최고의 컴퓨터 비전 엔지니어는 전체 파이프라인을 생각합니다:

  1. 획득 – 이미지가 어떻게 캡처되는가.
  2. 전처리 – 리사이징, 정규화, 대비 향상(예: CLAHE).
  3. 모델링 – 아키텍처, 학습 루프, 손실 함수.
  4. 후처리 – 해석, 시각화, 배포.

CLAHE와 같이 작지만 적절히 배치된 단계는 전체 시스템을 더 효율적으로 작동하게 만들 수 있습니다.

이 내용이 도움이 되었거나 자신의 파이프라인에 CLAHE를 적용하는 방법에 대해 질문이 있다면 아래에 댓글을 남겨 주세요. 컴퓨터 비전에 대해 언제든 이야기하고 싶습니다!

0 조회
Back to Blog

관련 글

더 보기 »