정규화(Normalization)
이미지 작업에서도 정규화가 필요한 경우가 있습니다.
특정 영역에 몰려 있는 경우 화질을 개선하기도 하고, 이미지 간의 연산 시 서로 조건이 다른 경우 같은 조건으로 만들기도 합니다.
src: 정규화 이전의 데이터
dst: 정규화 이후의 데이터
alpha: 정규화 구간 1
beta: 정규화 구간 2, 구간 정규화가 아닌 경우 사용 안 함
type_flag: 정규화 알고리즘 선택 플래그 상수
type_flag는 alpha와 beta 구간으로 정규화하는 cv2.NORM_MINMAX, 전체 합으로 나누는 cv2.NORM_L1, 단위 벡터로 정규화하는 cv2.NORM_L2, 최댓값으로 나누는 cv2.NORM_INF가 있습니다.
dst = cv2.normalize(src, dst, alpha, beta, type_flag)
평탄화(Equalization)
평탄화는 각각의 값이 전체 분포에 차지하는 비중에 따라 분포를 재분배하므로 명암 대비를 개선하는 데 효과적입니다.
src: 대상 이미지, 8비트 1 채널
dst(optional): 결과 이미지
dst = cv2.equalizeHist(src, dst)
CLAHE
평탄화를 하면 이미지의 밝은 부분이 날아가는 현상이 발생합니다.
이런 현상을 막기 위해 이미지를 일정한 영역으로 나누어 평탄화를 적용합니다.
그러나 이 방식에도 문제가 있습니다. 일정한 영역 내에서 극단적으로 어둡거나 밝은 부분이 있으면 노이즈가 생겨 원하는 결과를 얻을 수 없게 됩니다.
이 문제를 피하기 위해서 어떤 영역이든 지정된 제한 값(아래 코드에서 clipLimit 파라미터)을 넘으면 그 픽셀은 다른 영역에 균일하게 배분하여 적용합니다. 이러한 평탄화 방식을 CLAHE라고 합니다.
clipLimit: 대비(Contrast) 제한 경계 값, default = 40.0
tileGridSize: 영역 크기, default = 8 x 8
clahe: 생성된 CLAHE 객체
clahe = cv2.createCLAHE(clipLimit, tileGridSize)
src: 입력 이미지
clahe.apply(src): CLAHE 적용