OpenCV 비전 실무5장 · 영상 향상과 학습용 전처리12 / 21← 이전목차다음 →MetaContents

5장. 영상 향상과 학습용 전처리

기법 고르는 기준

약국에서 약사는 증상을 듣고 약을 고릅니다. 열이 나면 해열제, 기침을 하면 기침약입니다. 사진도 4장의 판정(증상)에 따라 손질(약)을 고릅니다. 처음부터 센 약을 쓰지 않듯, 가벼운 손질부터 해 보고 다시 재어 봅니다.

어두움, 밝음, 대비 낮음, 고르지 않음의 네 판정마다 고를 손질을 나란히 놓은 비교 그림

그림의 네 상자가 판정마다 먼저 해 볼 손질입니다. 어두우면 감마 0.5, 밝으면 감마 2, 대비가 낮으면 정규화를 먼저 해 보고, 한쪽만 어두운 것처럼 고르지 않으면 CLAHE 를 씁니다. 여기서 증상이 4장의 판정이고, 약이 손질 함수입니다. 비유와 다른 점은, 사진은 손질한 뒤 바로 다시 재어 볼 수 있다는 것입니다.

판정과 손질

판정먼저 해 볼 손질그다음조심할 점
어두움감마 0.5대비가 낮게 남으면 정규화밝기만 더하면 대비는 그대로
밝음감마 2정규화이미 255 인 칸은 되살아나지 않는다
대비 낮음정규화평활화평활화는 지나치게 진해질 수 있다
한쪽만 어두움(역광, 그림자)CLAHEclipLimit 을 조금씩 올린다평균만 보면 정상으로 나올 수 있다
정상손대지 않는다모든 사진에 평활화를 하지 않는다

짧은 예시

Python
import cv2
import numpy as np

def gamma_table(gamma):
    return np.array([((i / 255) ** gamma) * 255 for i in range(256)]).round().astype(np.uint8)

# 판정 이름 → 손질 함수. 판정에 맞는 함수를 사전에서 꺼내 부른다
FIX = {
    "어두움": lambda g: cv2.LUT(g, gamma_table(0.5)),
    "밝음": lambda g: cv2.LUT(g, gamma_table(2.0)),
    "대비 낮음": lambda g: cv2.normalize(g, None, 0, 255, cv2.NORM_MINMAX),
}

gray = cv2.imread("ch04_exposure/bright.png", cv2.IMREAD_GRAYSCALE)
out = FIX["밝음"](gray)
print(round(float(gray.mean()), 1), "→", round(float(out.mean()), 1))   # 결과: 203.9 → 166.6

lambda 는 이름 없는 짧은 함수를 한 줄로 만드는 파이썬 문법입니다. 사전에 판정마다 함수를 넣어 두면 if 를 여러 번 쓰지 않아도 됩니다.

주의할 점

  • 판정 기준(평균 80 미만 등)과 손질의 숫자(감마 0.5 등)는 연습용으로 정한 값입니다. 실제 사진에서는 몇 장을 고쳐 보고 맞춥니다.
  • 한 번 고친 사진이 다른 판정으로 바뀔 수 있습니다(어두움 → 대비 낮음). 그래서 손질 뒤에 다시 진단합니다.
← 이전 절5장 · AI 학습용 전처리로서의 향상다음 절 →5장 · 실습 지도