opencv_pixel_2

NYC·2021년 7월 13일
0

opencv

목록 보기
4/7

히스토그램

히스토그램은 어떤 데이터가 얼마나 많은지를 나타내는 도수 분포표를 그래프로 나타낸 것

히스토그램을 사용하면 데이터의 분포 상태를 한눈에 쉽게 알아볼 수 있다.
화소의 분포를 나타내는 지표이기 때문에 이 분포를 이해하면 이미지, 영상의 특성을 판단할 수 있는 유용한 도구가 될 수 있다.

단일 채널의 히스토그램

단일 채널 8비트 행렬의 히스토그램
8비트 행렬이기 때문에 값의 범위가 0 ~ 255 사이
흑백 이미지 ( 오늘도 아이유 )

히스토그램에는 흰색 분포가 많은 것을 알수 있다.

import numpy as np 
import cv2 
import seaborn as sns
image = cv2.imread("0714_iu.jpeg",cv2.IMREAD_GRAYSCALE)
if image is None : raise Exception("image None")
cv2.imshow("image",image)
cv2.waitKey()
cv2.destroyAllWindows()
print(sns.histplot(image.flatten(),legend=None))

3채널( 컬러 )의 히스토그램



컬러 히스토그램

히스토그램 스트레칭

명암도 이미지에서 이미지가 선명하고 깨끗해보이려면 어두운 부분에서 밝은 부분까지 고르게 분포해야함
그렇지 않고 특정 밝기만 있다면 이미지가 전체적으로 선명하지 않아보인다.

이런 이미지의 히스토그램을 보면 분포가 좁게 나타난다.

이렇게 히스토그램의 분포가 좁아서 영상의 대비가 좋지 않은 이미지의 화질을 개선할 수 있는 알고리즘은 히스토그램 스트레칭이다.

명암 분포가 좁은 히스토그램을 좌우로 잡아당겨 고른 명암 분포를 가진 히스토그램이 되게 하는 것이다.

히스토그램의 가장 낮은 화소값과 가장 높은 화소값을 잡아당긴다.

낮은 화소는 0으로 높은 화소는 255로 당기는 것이다.

새 화소값 = (화소값 - low) / (high - low ) x 255

image = cv2.imread("0714_iu4.png",cv2.IMREAD_GRAYSCALE)
if image is None : raise Exception("image None")
image_flat = image.flatten()
low = 25
high = 80
idx = np.arange(0,256)
idx = (idx - low) / (high - low) *255
idx[0:int(low)] = 0
idx[int(high+1):] = 255
dst = cv2.LUT(image,idx.astype('uint8'))
cv2.imshow("dst",dst)
cv2.imshow("image",image)
cv2.waitKey()
cv2.destroyAllWindows()

어두운 부분이 사라지고 선명해진 것을 확인할 수 있다.
코드에서 low와 high 값을 min, max 함수로 찾았는데 0과 248이 나와서 결과가 좋지 않았음
히스토그램을 보고 직접 low와 high를 지정해서 좋은 결과 산출

profile
Vision_NLP

0개의 댓글