はじめに
最近、大学の研究室で画像処理を専門とすることになり、画像のエントロピーについて復習する機会があったのでまとめました。
エントロピーとは
エントロピーは「乱雑さ」を表し、熱力学や統計力学でも出てきます。また、エントロピーは画像の情報量を表す指標としても使われます。
画像のエントロピーの定義は以下のようになります。
画像の諧調(レベル)が 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/画素]
$$
2値画像(白黒画像)のエントロピー関数を求める
2値画像のエントロピー関数を描画してみました。
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))
まとめ
エントロピーの超基本のみしか書けませんでしたが、プログラミングを通して復習できてよかったです。何か間違いがあれば、ご指摘お願いいたします。