이미지의 엔트로피를 파이썬으로 찾아 보았습니다.

소개



최근, 대학의 연구실에서 화상 처리를 전문으로 하게 되어, 화상의 엔트로피에 대해 복습할 기회가 있었으므로 정리했습니다.

엔트로피란?



엔트로피는 「난잡함」을 나타내고, 열역학이나 통계역학에서도 나옵니다. 또한 엔트로피는 이미지의 정보량을 나타내는 지표로도 사용됩니다.

이미지의 엔트로피 정의는 다음과 같습니다.
이미지의 계조(레벨)가 0 ~ (k-1)인 K값 이미지로, 레벨 $i$의 출현 확률이 $P_i$로 하면, 1화소의 정보량은
$$
I = log_2(1/P_i) = -log_2P_i[bit]
$$
1화면 전체의 정보량이 엔트로피이므로, 전체 화소수를 $N$, 레벨 $i$의 화소수를 $N_i$로 하면, $P_i$는
$$
P_i = N_i/N
$$
엔트로피는
$$
H = -\sum P_ilog_2P_i [bit/픽셀]
$$

바이너리 이미지(흑백 이미지)의 엔트로피 함수 구하기



이진 이미지의 엔트로피 함수를 그려 보았습니다.
import numpy as np
import matplotlib.pyplot as plt

P0 = np.arange(0,1, 0.01) # レベル0の出現確率P0
P1 = 1 - P0 # レベル1の出現確率P1

# エントロピーの算出
H = -P0 * np.log2(P0) -P1 * np.log2(P1)

# グラフ描画設定
plt.plot(P0, H)
plt.xlabel("P0")
plt.ylabel("H")
plt.title('Entropy')

# ラベルの描画
plt.legend()
# グラフの描画実行
plt.show()

실행 결과

위 그림에서 $P_0 = 0.0$ or $P_0 = 1.0$에 가까울수록 엔트로피는 작고, $P_0 = 0.5$일 때 엔트로피는 최대가 되는 것을 알 수 있습니다.
즉, 흰색 or 검정색에 가까울수록 엔트로피는 작고, 흰색과 검정의 출현 확률이 50%씩일 때 엔트로피는 커진다는 것입니다.

이것은, 화상의 색채가 복잡할수록 정보량이 많고, 화상의 색사가 단순할수록 정보량이 적다는 것을 의미해, 감각적으로도 알 수 있지요.

흑백 이미지 엔트로피 찾기



다음으로 흑백 lena 님의 이미지의 엔트로피를 찾아 보겠습니다.
import cv2
import matplotlib.pyplot as plt
import numpy as np

img = cv2.imread('./img_data/lena_gray.jpg') #ファイルのバスは適宜変えてください
height, width, _ = img.shape

# ヒストグラム(各色の画素数)の算出
histgram = [0]*256
for i in range(height):
    for j in range(width):
        histgram[img[i, j, 0]] += 1

# エントロピーの算出
size = height * width
entropy = 0

for i in range(256):
    # レベルiの出現確率p
    p = histgram[i]/size
    if p == 0:
        continue
    entropy -= p*np.log2(p)

plt.imshow(img)
print('エントロピー:{}'.format(entropy))

실행 결과


요약



엔트로피의 초기본만 쓸 수 있었습니다만, 프로그래밍을 통해 복습할 수 있어서 좋았습니다. 뭔가 실수가 있으면 지적 부탁드립니다.

좋은 웹페이지 즐겨찾기