#Histogram EQ
Histogram Equlization이란 이미지 픽셀의 누적확률분포(PDF)를 사용하여 이미지의 Contrast를 늘리는 방법임
기존의 개별픽셀에 대해 Sigmoid 함수나 지수,로그 함수를 활용하여 밝기를 변경하는 방법에 비해서 원본 이미지의 훼손 없이 편집이 가능한 장점이 있다.
#이미지 생성
import cv2
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
image = cv2.imread("low-contrast-ex05.jpg",cv2.IMREAD_GRAYSCALE )
image_matrix = np.array(image)
Original_image= image_matrix
fig = px.imshow(image_matrix,color_continuous_scale=px.colors.sequential.gray)
fig.show()
위의 이미지를 활용해서 히스토그램 균일화를 해볼거임. 목표는 꽃잎과 꽃잎사이가 좀더 명확하게 구분이 될 수 있도록 해볼 거임
histogram_pixel,BIN_image=np.histogram(image_matrix,bins=256,range=(0,256))
BIN_image = BIN_image.astype(np.uint8)
BIN_image = np.delete(BIN_image, -1)
fig = px.bar(x=BIN_image,y=histogram_pixel)
fig.update_xaxes(title_text = 'Intensity')
fig.update_yaxes(title_text = 'Counts')
fig.update_layout(title_text="Histogram of Input Image")
fig.show()
이미지를 만들어보면 대략 80~200 픽셀 사이에서 밝기값이 집중된것으로 확인됨. 조금더 자세하게 보자면 0~80영역과 200~255의 영역의 밝기에서는 아무런 픽셀값이 없어 잉여부분으로 남는것이 보임. 히스토그램의 각 막대기를 들어서 양옆으로 옮겨본다면 이미지가 더욱더 명확하게 보이지 않을까 하는 발상으로 접근해보자
input_histogram_pixel,x=np.histogram(image_matrix,bins=256,range=(0,255))
HIST_PDF =[]
for i in range(1,257):
HIST_PDF.append(input_histogram_pixel[0:i].sum()/(425*640))
fig = px.bar(x=list(range(256)),y=HIST_PDF)
fig.update_xaxes(title_text = 'Intensity')
fig.update_yaxes(title_text = 'Counts')
fig.update_layout(title_text="PDF of Input Image")
fig.show()
PDF로 표현하면 위와 같은 그래프로 표현이 됨. PDF 그래프의 X축에 있는 값을 이미지에서 임의의 픽셀을 골랐을때 해당 밝기일 확률을 표시해준다고 보면된다. 예를 들어서 0~100까지 밝기를 가지는 픽셀을 고를 확률은 10% 라고 보면되고. 반대로 0~200픽셀까지 밝기를 선택할 확률은 100%라고 보면된다.
그러면 여기서 이런생각을 해보자 저기 있는 PDF의 경사가 조금더 완만한 형태를 띄게 된다면 모든영역의 값을 활용 할 수 있지 않을까 하고 말이다.
저발상을 활용하여 모든픽셀에 점유를 할 수 있도록 하면 아래와 같이 나타낼 수 있음
X,Y = image_matrix.shape
image_size = X*Y
result_EQ = []
for i in range(256):
result_EQ.append(int((255/image_size)*HIST_PDF[i]))
EQ_IMAGE = np.ones((X,Y))
for i in range(X):
for j in range(Y):
EQ_IMAGE[i,j] = result_EQ[image_matrix[i,j]]
fig = px.imshow(EQ_IMAGE,color_continuous_scale=px.colors.sequential.gray)
fig.show()
비교가 잘 안되다고 하면 원본 이미지를 같이 보자
같이 보면 차이가 난다고 봐도 될 것임
result_histogram_pixel,x=np.histogram(EQ_IMAGE,bins=256,range=(0,255))
HIST_PDF_RESULT =[]
for i in range(1,257):
HIST_PDF_RESULT.append(result_histogram_pixel[0:i].sum())
fig2 = px.bar(x=list(range(256)),y=result_histogram_pixel)
fig2.show()
fig3 = px.bar(x=list(range(256)),y=HIST_PDF_RESULT)
fig3.show()
최종적으로 적용 전 후를 비교 하면 위와같은 밝기 분포 차이를 나타낼 수 있다.