본문 바로가기
OpenCV

OpenCV 영상처리 - 명암비 조절, cv2.normalize

by Kwonys 2024. 3. 18.
728x90
반응형

명암비(contrast)

  • 밝은 곳과 어두운 곳 사이에 드러나는 밝기 정도의 차이

기본적인 명암비 조절 함수

* s : 기울기

s를 0.5로 두었을 때 픽셀의 최대값이 128로 낮아지며 영상이 어두워짐

s를 2로 두었을 때 픽셀의 최대값은 255으로 같지만 전체적으로 포화되는 부분이 많아짐

효과적인 명암비 조절 함수

 

 

위 함수를 통해 어느 한 쪽의 색으로 치우치지 않고 균일하게 명암비를 조절할 수 있다.

* 명확히 정해진 명암비 조절 함수는 없고 내가 알맞게 조절하여 사용해야 함. 

 

기본적인 명암비 조절 예제

src = cv2.imread('lenna.bmp', cv2.IMREAD_GRAYSACLE)

alpha = 1.0
dst = np.clip((1+alpha)*src - 128*alpha, 0, 255).astype(np.uint8)

* np.clip -> saturate 역할

  • 실행 결과 :

영상의 자동 명암비 조절

히스토그램 스트레칭(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
  • dtype : 결과 영상의 타입
  • mask : 마스크 영상

히스토그램 스트레칭을 이용한 명암비 자동 조절

src = cv2.imread('Hawkes.jpg', cv2.IMREAD_GRAYSCALE)
dst = cv2.normalize(src, None, 0, 255, cv2.NORM_MINMAX)

  • src, dst의 히스토그램 확인
def getGrayHistImage(hist):
    imgHist = np.full((100, 256), 255, dtype=np.uint8)

    histMax = np.max(hist)
    for x in range(256):
        pt1 = (x, 100)
        pt2 = (x, 100 - int(hist[x, 0] * 100 / histMax))
        cv2.line(imgHist, pt1, pt2, 0)

    return imgHist

hist1 = cv2.calcHist([src], [0], None, [256], [0, 256])
histImg1 = getGrayHistImage(hist1)

hist2 = cv2.calcHist([dst], [0], None, [256], [0, 256])
histImg2 = getGrayHistImage(hist2)

cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.imshow('histImg1', histImg1)
cv2.imshow('histImg2', histImg2)

 

히스토그램 스트레칭 변환함수

  • 변환 함수 직선의 방정식 구하기

src = cv2.imread('Hawkes.jpg', cv2.IMREAD_GRAYSCALE)
gmin, gmax, _, _ = cv2.minMaxLoc(src)
dst = ((src - gmin) * 255. / (gmax - gmin)).astype(np.uint8)

 

728x90
반응형