본문 바로가기
AI 컴퓨터 비전프로젝트

[DL] 균등화, 평탄화단점보완 CLAHE(이미지, 영상 품질관련)(3)

by 바다의 공간 2024. 9. 28.
3. CLAHE(클라히)(Contrast Limited Adaptive Histogram Equalization)
- 평탄화를 하면 이미지의 밝은 부분이 날라가는 현상이 생길 수 있음
- 이미지의 일정한 영역을 나누어 평탄화를 적용
- 객체 = cv2.createCLAHE() => 객체.apply(영상)

평탄화 작업을 하게되면 단점이 이미 밝은사진같은경우에는  이미지가 날라가는 현상이 생길 수 있어서

이미지의 일정한 영역을 나누어서 평탄화를 적용하게 됩니다.

- 객체 = cv2.createCLAHE() => 객체.apply(영상)

를 사용합니다.

 

#히스토그램에서 특정 픽셀 값이 지나치게 많이 분포되어 있을 때 이를 제한하여과도한 대비가 생기지 않도록 합니다(1~4, 클수록 강한 대비)
# tileGridSize: 블록(타일)으로 나누고 각 타일에 대해 히스토그램 균등화를 개별적으로 수행합니다.
# 너무 작으면 경계가 생기거나 노이즈가 증가, 큰 타일 크기는 부드러운 대비 향상을 가져오지만 디테일을 살리기 어려움

 


import cv2

img = cv2.imread('./field.bmp')
img = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)


img_eq = img.copy()
img_clahe = img.copy()
img = cv2.cvtColor(img, cv2.COLOR_YCrCb2BGR)

img_eq[:, :, 0] = cv2.equalizeHist(img_eq[:, :, 0])
img_eq = cv2.cvtColor(img_eq, cv2.COLOR_YCrCb2BGR)

#히스토그램에서 특정 픽셀 값이 지나치게 많이 분포되어 있을 때 이를 제한하여과도한 대비가 생기지 않도록 합니다(1~4, 클수록 강한 대비)
# tileGridSize: 블록(타일)으로 나누고 각 타일에 대해 히스토그램 균등화를 개별적으로 수행합니다.
# 너무 작으면 경계가 생기거나 노이즈가 증가, 큰 타일 크기는 부드러운 대비 향상을 가져오지만 디테일을 살리기 어려움

clahe = cv2.createCLAHE(clipLimit=4,tileGridSize=(4, 4))
img_clahe[:, :, 0] = clahe.apply(img_clahe[:, :, 0])
img_clahe = cv2.cvtColor(img_clahe, cv2.COLOR_YCrCb2BGR)

cv2.imshow('img', img)
cv2.imshow('img_eq', img_eq)
cv2.imshow('img_clahe', img_clahe)
cv2.waitKey()






여기서 자꾸 이미지가 색이 막 멋대로 나와서 이상해서 이유를 찾아보니 

BGR2YCrCb  -> YCrCb2RBG

RGB2YCrCb -> YCrCb2RGB

등 뭔가 잘못작성을 해서 이렇게 되더라구요. 정확하게 알고 어떻게 변환이 되는지 확인하고 생각하면서 

코드를 작성했었어야됐는데 이 부분은 결과로 보이니 확 와닿고 다시 처음부터 보게되면서 반성했습니다.

 

##가운데 G는 똑같고 OpenCV에서의 색상만 변경이 되는겁니다

상황/도구색상 순서

일반적인 이미지 파일 RGB
OpenCV (기본) BGR