안녕하세요! 오늘은 이미지 분석의 기본 도구인 히스토그램(Histogram)과 이를 활용해 이미지의 화질을 개선하는 세 가지 핵심 기법인 정규화, 평탄화, CLAHE에 대해 알아보겠습니다.
이미지의 명암 분포를 확인하고, 너무 어둡거나 밝기가 뭉친 영상을 선명하게 만드는 기술입니다.
1. 히스토그램 (Histogram)
히스토그램은 영상 내 픽셀값(0 ~ 255)이 각각 몇 개씩 분포하는지 그래프로 나타낸 것입니다. 이를 통해 이미지의 전체적인 밝기나 색상 분포를 한눈에 파악할 수 있습니다.
🛠️ cv2.calcHist() 함수
OpenCV에서 히스토그램을 계산할 때는 다음 함수를 사용합니다.
- img: 이미지 리스트 (예: [img])
- channels: 분석할 채널 (예: 흑백은 [0], 컬러는 [0, 1, 2])
- histSize: 빈(bin)의 개수 (보통 [256])
- ranges: 픽셀값의 범위 (보통 [0, 256])
2. 정규화 (Normalization)
이미지의 픽셀값이 특정 영역에 몰려 있어 화질이 희미할 때, 이를 전체 영역 (0 ~ 255) 으로 골고루 펴주는 작업입니다.
- 함수: cv2.normalize(src, dst, alpha, beta, type_flag)
- 핵심 플래그: cv2.NORM_MINMAX (최솟값과 최댓값을 기준으로 구간 정규화)
3. 평탄화 (Histogram Equalization)
정규화는 단순히 범위를 넓혀주는 것이라면, 평탄화는 각 픽셀값의 빈도수(비중)를 계산하여 분포를 재배치합니다. 명암 대비(Contrast)를 극대화하는 데 매우 효과적입니다.
- 함수: cv2.equalizeHist(src)
- 주의사항: 반드시 8비트 1채널(Grayscale) 이미지에만 적용 가능합니다. 컬러 이미지는 YUV나 HSV로 변환 후 밝기(Y 또는 V) 채널에만 적용해야 합니다.
4. CLAHE (Contrast Limited Adaptive Histogram Equalization)
전역 평탄화(Equalization)를 이미지 전체에 적용하면, 너무 밝은 부분이 하얗게 날아가거나 노이즈가 심해지는 부작용이 있습니다. 이를 해결하기 위해 이미지를 일정한 타일 구역으로 나눠 평탄화하는 방식이 CLAHE입니다.
- 동작 원리: 영역별로 평탄화를 하되, 특정 제한값(clipLimit)을 넘는 픽셀은 주변에 골고루 배분하여 노이즈 발생을 억제합니다.
- 사용법:
Python
# CLAHE 객체 생성 (대비 제한 3.0, 타일 크기 8x8)
clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8, 8))
# 이미지에 적용
img2 = clahe.apply(img)
🛠️ 핵심 기법 한눈에 비교
| 기법 | 특징 | 추천 상황 |
| 정규화 | 픽셀값 범위를 선형적으로 확장 | 화질이 전반적으로 희미할 때 |
| 평탄화 | 빈도 기반으로 명암비 극대화 | 너무 어둡거나 명암비가 낮을 때 |
| CLAHE | 부분 영역별 적응형 평탄화 | 조명 차이가 심하고 디테일 유지가 중요할 때 |
🚀 마치며
화질 개선 작업은 분석 알고리즘의 정확도를 높이는 전처리 과정에서 매우 중요합니다. 특히 야외 촬영 영상처럼 조명 조건이 불규칙한 환경에서는 단순 평탄화보다 CLAHE가 훨씬 안정적인 결과물을 제공합니다.
궁금하신 점은 댓글로 남겨주시기 바랍니다.
반응형
'컴퓨터 과학 > 👀 컴퓨터 비전' 카테고리의 다른 글
| 📸 [OpenCV 기초] 이미지 유사도 비교부터 모션 감지 CCTV까지 실습 완벽 정리 (0) | 2026.01.07 |
|---|---|
| 📸 [OpenCV 기초] 2차원 히스토그램과 역투영(Back Projection) 완벽 정리 (0) | 2026.01.07 |
| 🖼️ [OpenCV 기초] 이미지 연산과 합성 (블렌딩, 마스킹) (0) | 2026.01.07 |
| 🌓 [OpenCV 기초] 스레시홀딩(Thresholding)과 오츠의 알고리즘 (0) | 2026.01.07 |
| 🎨 [OpenCV 기초] 이미지 색상 표현 방식 (BGR, HSV, YUV) 이해하기 (0) | 2026.01.07 |