LoginSignup
13
13

More than 1 year has passed since last update.

画像のエントロピーをpythonで求めてみた

Last updated at Posted at 2020-04-04

はじめに

最近、大学の研究室で画像処理を専門とすることになり、画像のエントロピーについて復習する機会があったのでまとめました。

エントロピーとは

エントロピーは「乱雑さ」を表し、熱力学や統計力学でも出てきます。また、エントロピーは画像の情報量を表す指標としても使われます。

画像のエントロピーの定義は以下のようになります。
画像の諧調(レベル)が 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))

実行結果

まとめ

エントロピーの超基本のみしか書けませんでしたが、プログラミングを通して復習できてよかったです。何か間違いがあれば、ご指摘お願いいたします。

13
13
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
13