Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

航空写真の画素B(青)G(緑)R(赤)平均値を求め棒グラフにする

市街地、森林、海などの航空写真に対して画像っ全体のB(青)G(緑)R(赤)の平均値を求めどのような傾向にあるか調べます。

やること
  • 航空写真を4枚読み出し、各写真の画素B(青)G(緑)R(赤)平均値を求める
  • 求めた結果を棒グラフにする
使った関数
  • cv2.imread : 画像ファイルの読み出し
  • numpy.mean : 配列の指定した要素の平均を求める
  • matplotlib.pyplot.bar : 棒グラフのプロット
  • matplotlib.pyplot.show : プロットの表示
環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
  • OpenCV 4.0.0
準備

国土地理院の空中写真を元に以下の4つの画像を用意しjupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。 

f:id:T_A_T:20190323191909p:plain
Kobe_Nada.png

f:id:T_A_T:20190323191944p:plain
Kobe_Sumiyoshi.png

f:id:T_A_T:20190323191959p:plain
Kobe_Maya.png

f:id:T_A_T:20190323192048p:plain
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]

f:id:T_A_T:20190323194043p:plain

森林面積が増えると緑の輝度が大きく、赤の輝度が小さくなることが分かります。また、海の写真は青の輝度が高く、赤の輝度が小さくなっています。

以下のサイトを参考にさせていただきました

Numpy公式 >> numpy.mean
matplotlib公式 >> matplotlib.pyplot.bar
note.nkmk.me >> NumPy配列の行・列ごとの合計、平均、最大、最小などを算出

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村