728x90
Global Histogram Equalization의 단점.
Illumination이 불균일한 경우, 이미지에서 특정 부분은 밝고 특정 부분은 어두움.
이 경우, Global Processing 기반의 Histogram Equalization은 효과가 좋지 못함.
아래 그림에서 조명이 불균일하여 global HE가 효과가 좋지 않음을 보여줌 (석고상의 대비가 오히려 나뻐짐)
이를 개선한 방법이 Contrast Limited Adaptive Histogram Equalization (CLAHE)임.
관련 gist
https://gist.github.com/dsaint31x/5606a3b51023d64f5e29ea524ac469dc
CLAHE의 과정
이미지는 "tiles"(OpenCV에서 기본 tileSize는 8x8)라고 불리는 작은 block (or patch)으로 나뉨: Adaptive
- 각 블록에 대해 일반적인 histogram equalization이 수행됨.
- 작은 영역 내에서 히스토그램은 그 영역에 제한됨(노이즈가 없는 경우).
- 해당 블록에 노이즈가 있을 경우, 증폭되는 문제점이 있음.
이를 방지하기 위해 contrast limiting이 적용됨: Contrast Limited
- 특정 히스토그램 bin이 지정된 대비 한계(기본적으로 OpenCV에서는 40)를 초과하면,
- 초과 픽셀들은 잘리고 다른 bin에 균일하게 분배됨.
- 이같은 redistribution을 수행하고 나서 cdf를 계산하여 histogram equalization 적용.
추가적으로 타일 경계에서 발생하는 아티팩트를 제거하기 위해 bilinear interpolation이 적용됨.
결과
OpenCV에서 제공하는 CLAHE의 결과는 다음과 같음.
# CLAHE(Contrast Limited Adaptive Histogram Equalization) 객체를 생성하는 코드
# clipLimit: 히스토그램 클립핑 한계를 설정하는 파라미터.
# 이 값은 대비를 제한하는 기준으로, 높은 값일수록 더 많은 대비가 적용됨.
# 기본값은 40.0으로 설정되어 있음.
# tileGridSize: 이미지를 작은 타일로 나눌 때의 타일 크기를 설정하는 파라미터.
# 각 타일에 대해 개별적으로 히스토그램 평활화를 수행함.
# (8,8)은 이미지를 8x8 크기의 작은 블록으로 나눈다는 뜻임.
# 기본값은 (8,8)으로 설정되어 있음.
clahe = cv2.createCLAHE(clipLimit=40.0, tileGridSize=(8,8))
# img에 CLAHE를 적용하여 히스토그램 평활화된 이미지를 img2에 저장.
# clahe.apply()는 이미지를 입력받아 CLAHE를 적용한 후 결과를 반환함.
img2 = clahe.apply(img)
반응형
'Programming > DIP' 카테고리의 다른 글
[DIP] Histogram Stretching (0) | 2024.10.07 |
---|---|
[DIP] (Global) Histogram Equalization (0) | 2024.10.07 |
[DIP] Histogram Matching: Image Enhancement (0) | 2024.10.07 |
[DIP] Moirè (모아레) (and Beat) (3) | 2024.09.30 |
[DIP] cv2.convertSacleAbs(): contrast, brightness 수동조정 (0) | 2024.09.23 |