BLOG

 

235日のセブIT留学  成長日記「Pythonで画像解析_色分け!④」 ( 50/235 days )

27 8月 2018, Posted by keisuke in IT留学, プログラミング

こんばんわ!Keisukeです!

 

前回の方針ではさっぱりダメだった原因を見つけました!

 

まず画素のRGBの構成ですが

 

R,G,Bの順でデータを持っているわけではなく…

B,G,Rの順でデータが格納されているようです!

 

更に新しい方針を考えました!

 

方針④

・RGB画素値を全て合計する

→画像内に存在するRGB値の頻度がわかる

 

方針⑤

・ヒストグラムを10分割し, 合計値を算出する, 分割位置×合計値 で比較

→単色のようなショック波形を判断する

 

以下コード

**************************

import cv2

import numpy as np

from matplotlib import pyplot as plt

 

def sum(data):

   sum = 0

   for i in range(len(data)):

       sum = sum + data[i]

 

   return sum

 

def mean(data):

   sum_ave = sum(data)

   mean = sum_ave / len(data)

 

   return mean

 

def distribute(data_r,data_g,data_b): # distribute(–R–,–G–,–B–)

   print(“画像の主要な色 : ”)

   if(data_r > data_g and data_r > data_b):

       print(“赤色”)

   if(data_g > data_r and data_g > data_b):

       print(“緑色”)

   if(data_b > data_g and data_b > data_r):

       print(“青色”)

   if(data_b == data_g and data_b > data_r):

       print(“水色”)

   if(data_r == data_b and data_r > data_g):

       print(“紫色”)

   if(data_g == data_r and data_g > data_b):

       print(“黄色”)

   if(data_r == data_g and data_r == data_b):

       print(“灰色”)

 

if __name__ == “__main__”:

 

   # 画像読み込み

   # ——————————————————————————–#

   #img = cv2.imread(‘IMG_5671.JPG’) # 1219万画素 20分

   img = cv2.imread(‘input.png’)

   print(“画素 : “,len(img))

   img_r = []

   img_g = []

   img_b = []

   for rgb in range(len(img[0][0])):

       for y in range(len(img)):

           for x in range(len(img[y])):

               if(rgb is 0):

                   img_b.append(img[y][x][rgb])

               if(rgb is 1):

                   img_g.append(img[y][x][rgb])

               if(rgb is 2):

                   img_r.append(img[y][x][rgb])

   # ——————————————————————————–#

 

   # ヒスとグラムに変換 0~256

   # ——————————————————————————–#

   

   hist_r = []

   hist_g = []

   hist_b = []

   hist_k = []

   for count_img in range(256):

       add_r = 0

       add_g = 0

       add_b = 0

       add_k = 0

       print(count_img)

       for size_img in range(len(img_r)):

           if(count_img == img_r[size_img]):

               add_r = add_r + 1

               add_k = add_k + 1

 

           if(count_img == img_g[size_img]):

               add_g = add_g + 1

               add_k = add_k + 1

 

           if(count_img == img_b[size_img]):

               add_b = add_b + 1

               add_k = add_k + 1

 

       hist_r.append(add_r)

       hist_g.append(add_g)

       hist_b.append(add_b)

       hist_k.append(add_k)

       

 

   # 方針4 画素値の合計 ※ヒストグラム未使用

   # ——————————————————————————–#

   print(“———-方針4———-“)

   sum_r = sum(img_r)

   sum_g = sum(img_g)

   sum_b = sum(img_b)

   ave_r = round(sum_r/len(img_r))

   ave_g = round(sum_g/len(img_g))

   ave_b = round(sum_b/len(img_b))

 

   print(“*************************************************”)

   print(“ave_R : “,ave_r)

   print(“ave_G : “,ave_g)

   print(“ave_B : “,ave_b)

   print(“*************************************************”)

   distribute(ave_r,ave_g,ave_b)    

   # ——————————————————————————–#

 

   # 方針5 ヒストグラムを16分割し比較

   # ——————————————————————————–#

   print(“———-方針5———-“)

   hist_r_split = []

   hist_g_split = []

   hist_b_split = []

   hist_r_max = 0

   hist_g_max = 0

   hist_b_max = 0

   hist_r_max_range = -1

   hist_g_max_range = -1

   hist_b_max_range = -1

   for i in range(16):

       hist_r_split.append(sum(hist_r[(i*16):((i*16)+16)]))

       if(hist_r_split[i] > hist_r_max):

           hist_r_max = hist_r_split[i]

           hist_r_max_range = i

       hist_g_split.append(sum(hist_g[(i*16):((i*16)+16)]))

       if(hist_g_split[i] > hist_g_max):

           hist_g_max = hist_g_split[i]

           hist_g_max_range = i

       hist_b_split.append(sum(hist_b[(i*16):((i*16)+16)]))

       if(hist_b_split[i] > hist_b_max):

           hist_b_max = hist_b_split[i]

           hist_b_max_range = i

   

   print(“*************************************************”)

   print(“R : “,hist_r_max,”range_R : “,hist_r_max_range)

   print(“G : “,hist_g_max,”range_G : “,hist_g_max_range)

   print(“B : “,hist_b_max,”range_B : “,hist_b_max_range)

   print(“*************************************************”)

   distribute((hist_r_max_range*hist_r_max),(hist_g_max_range*hist_g_max),(hist_b_max_range*hist_b_max))

   # ——————————————————————————–#

   

   # グラフ表示

   # ——————————————————————————–#

   ”’

   plt.plot(hist_r,color = ‘r’)

   plt.plot(hist_g,color = ‘g’)

   plt.plot(hist_b,color = ‘b’)

   #plt.plot(hist_k,color = ‘k’)

   plt.show()

   ”’

   # ——————————————————————————–#

   

 

**************************

 

実行結果

画像:R.jpeg

———-方針4———-

*************************************************

ave_R :  254.0

ave_G :  0.0

ave_B :  0.0

*************************************************

画像の主要な色 : 

赤色

———-方針5———-

*************************************************

R :  48400 range_R :  15

G :  48400 range_G :  0

B :  48400 range_B :  0

*************************************************

画像の主要な色 : 

赤色

 

画像:G.jpg

———-方針4———-

*************************************************

ave_R :  18.0

ave_G :  102.0

ave_B :  50.0

*************************************************

画像の主要な色 : 

緑色

———-方針5———-

*************************************************

R :  41078 range_R :  1

G :  48314 range_G :  6

B :  39313 range_B :  3

*************************************************

画像の主要な色 : 

緑色

 

画像:B.jpeg

———-方針4———-

*************************************************

ave_R :  21.0

ave_G :  88.0

ave_B :  219.0

*************************************************

画像の主要な色 : 

青色

———-方針5———-

*************************************************

R :  48400 range_R :  1

G :  48400 range_G :  5

B :  48274 range_B :  12

*************************************************

画像の主要な色 : 

青色

 

画像:input.png

———-方針4———-

*************************************************

ave_R :  180.0

ave_G :  99.0

ave_B :  106.0

*************************************************

画像の主要な色 : 

赤色

———-方針5———-

*************************************************

R :  11827 range_R :  13

G :  7365 range_G :  8

B :  12053 range_B :  5

*************************************************

画像の主要な色 : 

赤色

 

やっと完成しましたね!

 

方針④, 方針⑤は精度が良いように思えます!

精密な混合色の場合どういった動きになるか, 未検証なので当分は2つの方針を併用して使っていきたいと思います!

 

[今日の達成]

・画像の色別振り分けができた

 

[今日の未消化]

・混合色の画像の色分け

・OpenCVで再現する

・複数の画像を一度に処理する

 

Post a comment