Python/파이썬 OpenCV 공부

[파이썬 OpenCV] 영상의 명암비 조절 - 히스토그램 스트레칭, 정규화(cv2.normalize)

AI 꿈나무 2020. 9. 28. 16:13
반응형

황선규 박사님의 OpenCV 강의를 공부하면서 정리하였습니다.

 


영상의 명암비 조절

 명암비(Contrast)는 밝은 곳과 어두운 곳 사이에 드러나는 밝기 정도의 차이를 의미합니다.

 

1. 기본적인 명암비 조절 - np.clip

 그레이스케일의 픽셀값을 조정하여 명암비를 조절하는 법을 알아보겠습니다.

 np.clip으로 saturate 연산을 구현하였고 아래의 방정식을 구현하였습니다.

 

[예제 코드]

src = cv2.Imread('lenna.bmp', cv2.IMREAD_GRAYSCALE)

if src is None:
    print('Image load failed!')
    sys.exit()

alpha = 1 # 기울기
dst = np.clip((1 + alpha) * src - 128 * alpha), 0, 255).astype(np.unit8)

cv2.imshow('src', src)
cv2.imshwo('dst', dst)
cv2.waitKey()

cv2.destroyAllWIndows()

 alpha값을 변경해주면서 원하는 명암비를 설정해줄 수 있습니다. 

 

 

[결과]

 명암비가 변경되었습니다.

 

2. 영상의 자동 명암비 조절 - 정규화 함수(cv2.normalize)

 OpenCV에서 cv2.normalize() 함수를 이용하면 히스토그램 스트레칭 기법을 구현할 수 있습니다.

 

히스토그램 스트레칭(Histogram stretching)

• 영상의 히스토그램이 그레이스케일 전 구간에서 걸쳐 나타나도록 변경하는 선형 변환 기법입니다.

 

[함수 설명]

cv2.normalize(src, dst, alpha=None, beta=None, norm_type=None, dtype=None, mask=None) -> dst

• src: 입력 영상
• dst: 결과 영상 (None 입력)
• alpha: (노름 정규화인 경우) 목표 노름 값, (원소 값 범위 정규화인 경우) 최솟값
• beta: (원소 값 범위 정규화인 경우) 최댓값
• norm_type: 정규화 타입. NORM_INF, NORM_L1, NORM_L2, NORM_MINMAX.
    히스토그램 스트레칭은 NORM_MINMAX
• dtype: 결과 영상의 타입
• mask: 마스크 영상

[예제 코드]

src = cv2.imread('Hawkes.jpg', cv2.IMREAD_GRAYSCALE)

if src is None:
    print('Image load failed!')
    sys.exit()
    
dst = cv2.normalize(src, None, 0, 255, cv2.NORM_MINMAX) # 히스토그램 스트레칭은 NORM_MINMAX

# 넘파이로 히스토그램 스트레칭 구현
gmin = np.min(src)
gmax = np.max(src)
dst = np.clip((src - gmin) * 255. / (gmax - gmin), 0, 255).astype(np.unit8))

cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()

cv2.destroyAllWindows()

 

[결과]

히스토그램 스트레칭 적용

 

 이처럼 히스토그램 스트레칭을 적용하면 명암비가 적절하게 조절됩니다.

 

반응형