【Python】対象物の画素値RGBの平均値を計算する


1. 概要

今回紹介するのは、対象物の画素値RGBの平均値をcsvファイルに出力する処理です。

りんごなど、対象物の画像の画素値の平均を求めたい!
という時に使用できます。この処理を構築した経緯としては、以前私がQiitaに投稿した記事にあります。↓
【Python】サポートベクタマシン(SVM)を使って画素値からりんごと梨を分類

この記事で取り上げた手法の前処理、「りんごと梨の画像それぞれのRGB画素値の平均値の取得」を行うために本処理を使用しています。

本処理をするにあたって必要な情報は対象物が映っている画像だけあればOKです。ただし、背景が入っていると正しく計算できないので、ペイントなどのアプリを使って下図のようにきれいに対象物だけをトリミングしておきます。

2. 環境

画像処理でopenCV、そしてデータフレームとしてpandasを使用するので事前にこれらのライブラリのインストールをおねがいします。

pip install opencv-python
pip install pandas

3. コード

コードはこちらになります。注意点としてはopenCVを使用するので、出力がRGBではなく、BGRの順番になります。

bgr_csv.py
import cv2
import numpy as np
import pandas as pd

idir = 'input/'
odir = 'output/'
fname='apple'
num_photo=10
bgr = np.zeros((num_photo,3))

for k in range(num_photo):

    img = cv2.imread(idir + fname + '_' + str(k+1) + '.jpg')  #1番からスタート
    print(idir + fname + '_' + str(k+1) + '.jpg')
    h, w, c = img.shape #height, width, channnel

    #初期化
    l=0
    b_ave=0; g_ave=0; r_ave=0

    for i in range(h):
        for j in range(w):
            #画素値[0,0,0](Black)を除外してピクセルの和とbgrの画素値の合計を計算する
            if(img[i,j,0] != 0 or img[i,j,1] != 0 or img[i,j,2] != 0 ):
                l+=1    #対象となるピクセル数を計算する
                #対象となるピクセルの画素値の和を計算する
                b_ave=b_ave+img[i,j,0]
                g_ave=g_ave+img[i,j,1]
                r_ave=r_ave+img[i,j,2]

    #画素値合計をピクセル数で除することでRGBの画素値の平均値を求める
    b_ave=b_ave/l
    g_ave=g_ave/l
    r_ave=r_ave/l

    bgr[k]=np.array([b_ave, g_ave, r_ave])

df = pd.DataFrame(bgr, columns=['blue', 'green', 'red'])    #opencvの並び準BGRに合わせる
df.to_csv(odir + fname + '.csv')

例えば、、、

fname='apple'
num_photo=1

とした場合は「input/apple_1.jpg」のファイル1つだけの各画素値の平均値を「output/apple.csv」として出力します。

4. 結果

10個のりんごの画像を処理したら下のように、10個分のBGR画像の平均値を取得したapple.csvファイルが出力されます。

apple.csv
,blue,green,red
0,39.88469583593901,28.743374377331637,137.23369201906283
1,83.72563703792319,79.59471228615863,164.77884914463453
2,66.8231805177587,74.52501570023027,141.8854929872305
3,55.2837418388098,45.28968211495237,148.4160869099861
4,37.59397951454073,49.82323881039423,137.30237460066527
5,53.68868757437335,50.963264366051206,142.6121454070861
6,51.277953772145956,64.07145371348116,152.98116860260473
7,50.47702848900108,48.37151099891814,124.46714749368914
8,40.35442093843233,52.0682126390019,137.8299091402224
9,48.18758094199441,55.87655919841865,145.6361529548088

概要にも記載の通り、このコードで出力したりんごと梨のcsvファイルを使って↓
【Python】サポートベクタマシン(SVM)を使って画素値からりんごと梨を分類

を行っています。こちらの記事も是非見てみてくださいね!