【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"의 파일 하나만의 각 픽셀 값의 평균값을 "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)을 사용해 화소치로부터 사과 배를 분류

하고 있습니다. 이쪽의 기사도 꼭 봐 주세요!

좋은 웹페이지 즐겨찾기