히스토그램 평활화나 스트레칭은 주로 어두운 영상이나 밝은 영상에서 명암 대비를 높여주기위해 사용한다.
히스토그램을 가지고 평활화를 하거나 스트레칭을 하는 기법은 주로 그레이스케일 차원에서 이루어진다. 즉, rgb 데이터인 경우 명암을 관장하는 채널을 추출하기 위해 Yuv나 Lab 컬러모델로 변환 후 Y 값이나 L 값을 이용하여 평활화, 스트레칭 적용 후 다시 머징하는 것이 기본 과정이다.
히스토그램 평활화에 여러 기법들이 있는데 크게 두가지로 나눌 수 있다.
Global: 영상 전체를 입력하여같은 모든 픽셀에 파라미터를 적용하는 것
Adaptive: 윈도우 사이즈를 정하여 부분 별로 파라미터를 적용하는 것
Global의 단점을 개선하기 위해 Adaptive 기법이 제안되었는데 Global의 단점은 특정 부분의 명도대비가 적고 특정부분이 높을 경우 모두 원만하게 처리가 불가능하다는 점이다. 즉, 같은 파라미터로 적용하니 제대로된 값을 얻기 어렵다는 뜻이다.
히스토그램 평활화를 python으로 적용하려면 간단하게 아래와 같은 코드를 사용하면 된다.
src = cv2.imread('something.png', cv2.IMREAD_GRAYSCALE)
dst = cv2.equalizeHist(src)
Adaptive 기법의 대표주자는 Contrast Limited Adaptive Histogram Equalization (CLAHE) 기법이 있다. 마찬가지로 Python으로 적용해 보려면 다음과 같다. CLAHE는 말 그대로 명도대비를 제한하며 적응적으로 히스토그램을 평활화하는 것으로 파라미터가 윈도우 사이즈, 클립 리미트가 들어간다. 클립 리미트가 명도 제한 값이고 tilieGridSize가 윈도우 사이즈이다.
#CLAHE
lab = cv2.cvtColor(im, cv2.COLOR_BGR2LAB)
lab_planes = cv2.split(lab)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(4,4))
lab_planes[0] = clahe.apply(lab_planes[0])
lab = cv2.merge(lab_planes)
bgr1 = cv2.cvtColor(lab, cv2.COLOR_LAB2BGR)
위에서 언급했듯 불러온 im이 rgb 데이터라 가정할 때 opencv에선 bgr로 변환되므로 bgr2lab을 통해 명암 채널(l)을 추출한다.
이후 opencv에서 제공하는 createCLAHE 메소드에 파라미터를 입력하여 clahe를 생성해주고 명암 채널에 clahe를 적용한 후 머징한다.
다음은 스트레칭인데 스트레칭은 단순히 명암채널을 0~255로 노멀라이즈하는 것 뿐이다. 만약 어떤 영상의 픽셀값이 100~200 사이에 분포되어 있다면 노멀라이즈를 통해 스트레칭, 쫙 펴줄 수 있다. 코드는 아래와 같다.
#stretching
lab = cv2.cvtColor(im, cv2.COLOR_BGR2LAB)
lab_planes = cv2.split(lab)
lab_planes[0] = cv2.normalize(lab_planes[0], None, 0, 255, cv2.NORM_MINMAX)
lab = cv2.merge(lab_planes)
bgr1 = cv2.cvtColor(lab, cv2.COLOR_LAB2BGR)
아래 이미지는 각각 손금 데이터 원본, CLAHE, 스트레칭을 적용한 결과값이다.
'Python' 카테고리의 다른 글
python 폴더 내 파일 리스트 만들기 + 정렬(natsort) (0) | 2021.03.26 |
---|---|
opencv flip (0) | 2021.03.25 |
Python 원하는 GPU 사용하기 (0) | 2021.03.22 |
[python] youtube 동영상 다운로드 (1) | 2021.02.17 |
[python] opencv로 영상 읽고 FPS 조절 후 영상 저장 (0) | 2021.02.16 |