市街地、森林、海などの航空写真に対して画像っ全体のB(青)G(緑)R(赤)の平均値を求めどのような傾向にあるか調べます。
やること
- 航空写真を4枚読み出し、各写真の画素B(青)G(緑)R(赤)平均値を求める
- 求めた結果を棒グラフにする
使った関数
- cv2.imread : 画像ファイルの読み出し
- numpy.mean : 配列の指定した要素の平均を求める
- matplotlib.pyplot.bar : 棒グラフのプロット
- matplotlib.pyplot.show : プロットの表示
環境
準備
国土地理院の空中写真を元に以下の4つの画像を用意しjupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。

Kobe_Nada.png

Kobe_Sumiyoshi.png

Kobe_Maya.png

Kobe_Roku.png
コード
np.mean(img, axis=(0,1)) により、全画素にわたるBGRのそれぞれの平均値を求めています。axisは求める軸を示していますが opencvで読み出したカラー画像のndarrayは y座標(第0軸)、x座標(第1軸)、BGR画素(第2軸)の3次元配列オブジェクトとなっており axis=(0,1)と指定することで「第0軸(y座標)および第1軸(x座標)方向に」つまり全ての画素に渡って、計算されます。
import cv2 #opencvをインポート import numpy as np #numpyをインポート import matplotlib.pyplot as plt #matplotlib.pyplotをインポート fname=['Kobe_Nada.png','Kobe_Sumiyoshi.png','Kobe_Maya.png','Kobe_Roku.png'] #読み出すファイル名 left=1 #棒グラフ描画位置(x=1) for i in fname: #リストfnameからひとつづつ要素を取り出しなくなるまで繰り返す img = cv2.imread(i) #iで指定したファイル名の画像の読み出し bgr=np.mean(img, axis=(0,1)) #全画素のBGR(青緑赤)の平均値をbgrに代入 print(i,bgr) #ファイル名とBGRの平均値を表示 #リストbgrの1つ目の要素(Bの輝度)を棒グラフに青色でプロット plt.bar(left, bgr[0], width=1, color='b', edgecolor='k', linewidth=2 ) #リストbgrの2つ目の要素(Gの輝度)を棒グラフに緑色でプロット。位置(left)は青+1 plt.bar(left+1, bgr[1], width=1, color='g', edgecolor='k', linewidth=2) #リストbgrの3つ目の要素(Rの輝度)を棒グラフに赤色でプロット。位置(left)は青+2 plt.bar(left+2, bgr[2], width=1, color='r', edgecolor='k', linewidth=2) left=left+4 #leftを4つプラスする plt.show() #プロットの表示
実行結果
各写真のB(青)、G(緑)、R(赤)画素の輝度平均値が数字とグラフで表示されます。
Kobe_Nada.png [119.67672973 119.06908453 116.05126092]
Kobe_Sumiyoshi.png [117.70667001 124.00496627 113.43466217]
Kobe_Maya.png [121.61025127 127.63144898 110.51999636]
Kobe_Roku.png [93.72845965 78.5071724 58.86310437]

森林面積が増えると緑の輝度が大きく、赤の輝度が小さくなることが分かります。また、海の写真は青の輝度が高く、赤の輝度が小さくなっています。
以下のサイトを参考にさせていただきました
Numpy公式 >> numpy.mean
matplotlib公式 >> matplotlib.pyplot.bar
note.nkmk.me >> NumPy配列の行・列ごとの合計、平均、最大、最小などを算出