BLOG

 

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

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

こんばんわ!Keisukeです!

 

前回に引き続き画像の色分けを行います!

 

前回考えた方針に基づきコードを記述し検証していきたいと思います。

 

方針①

・光の3原色から色の明るいものほど主張が強いため, ヒストグラムのX軸とY軸を掛け合わせた状態で積分値を取得し比較する

 

方針②

・方針①に利用するヒストグラムのY軸を存在分布の比率にして積分値を比較する

 

方針③

・平均値を算出し, 平均値以上の数値で積分し比較する

 

評価方法

・単色の画像を利用し正しい比較ができているか

・目視で赤系統だとわかる画像で比較する

 

以下コード

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

import cv2

import numpy as np

from matplotlib import pyplot as plt

 

def mean(data):

   sum = 0

   for i in range(len(data)):

       sum = sum + data[i]

   mean = sum / len(data)

 

   return mean

 

if __name__ == “__main__”:

 

   # 画像読み込み

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

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

   img = cv2.imread(‘B.jpeg’)

   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_r.append(img[y][x][rgb])

               if(rgb is 1):

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

               if(rgb is 2):

                   img_b.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)

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

   

   # 方針0 台形積分 面積比較

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

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

   area_r_0 = 0

   area_g_0 = 0

   area_b_0 = 0

   for i in range(256):

       if(i>0):

           area_r_0 = area_r_0 + ((hist_r[i]+hist_r[i-1]*1)/2)

           area_g_0 = area_g_0 + ((hist_g[i]+hist_g[i-1]*1)/2)

           area_b_0 = area_b_0 + ((hist_b[i]+hist_b[i-1]*1)/2)

       else:

           area_r_0 = 0

           area_g_0 = 0

           area_b_0 = 0

 

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

   print(“red_area   : “,area_r_0)

   print(“green_area : “,area_g_0)

   print(“blue_area  : “,area_b_0)

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

   

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

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

   if(area_r_0 > area_g_0 and area_r_0 > area_b_0):

       print(“赤色”)

   if(area_g_0 > area_r_0 and area_g_0 > area_b_0):

       print(“緑色”)

   if(area_b_0 > area_g_0 and area_b_0 > area_r_0):

       print(“青色”)

   if(area_b_0 == area_g_0 and area_b_0 > area_r_0):

       print(“水色”)

   if(area_r_0 == area_b_0 and area_r_0 > area_g_0):

       print(“紫色”)

   if(area_g_0 == area_r_0 and area_g_0 > area_b_0):

       print(“黄色”)

   if(area_r_0 == area_g_0 and area_r_0 == area_b_0):

       print(“灰色”)

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

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

 

   # 方針1 色の値*存在分布 → 台形積分 面積比較

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

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

   area_r_1 = 0

   area_g_1 = 0

   area_b_1 = 0

   for i in range(256):

       if(i>0):

           area_r_1 = area_r_1 + (((i*hist_r[i])+((i-1)*hist_r[i-1])*1)/2)

           area_g_1 = area_g_1 + (((i*hist_g[i])+((i-1)*hist_g[i-1])*1)/2)

           area_b_1 = area_b_1 + (((i*hist_b[i])+((i-1)*hist_b[i-1])*1)/2)

       else:

           area_r_1 = 0

           area_g_1 = 0

           area_b_1 = 0

 

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

   print(“red_area   : “,area_r_1)

   print(“green_area : “,area_g_1)

   print(“blue_area  : “,area_b_1)

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

   

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

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

   if(area_r_1 > area_g_1 and area_r_1 > area_b_1):

       print(“赤色”)

   if(area_g_1 > area_r_1 and area_g_1 > area_b_1):

       print(“緑色”)

   if(area_b_1 > area_g_1 and area_b_1 > area_r_1):

       print(“青色”)

   if(area_b_1 == area_g_1 and area_b_1 > area_r_1):

       print(“水色”)

   if(area_r_1 == area_b_1 and area_r_1 > area_g_1):

       print(“紫色”)

   if(area_g_1 == area_r_1 and area_g_1 > area_b_1):

       print(“黄色”)

   if(area_r_1 == area_g_1 and area_r_1 == area_b_1):

       print(“灰色”)

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

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

   

   # 方針2 存在分布を比率に変換

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

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

   area_r_2 = 0

   area_g_2 = 0

   area_b_2 = 0

   hist_r_max = max(hist_r)

   hist_g_max = max(hist_g)

   hist_b_max = max(hist_b)

 

   for i in range(256):

       if(i>0):

           area_r_2 = area_r_2 + (((hist_r[i]/hist_r_max)+(hist_r[i-1]/hist_r_max)*1)/2)

           area_g_2 = area_g_2 + (((hist_g[i]/hist_g_max)+(hist_g[i-1]/hist_g_max)*1)/2)

           area_b_2 = area_b_2 + (((hist_b[i]/hist_b_max)+(hist_b[i-1]/hist_b_max)*1)/2)

 

       else:

           area_r_2 = 0

           area_g_2 = 0

           area_b_2 = 0

 

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

   print(“red_area   : “,area_r_2)

   print(“green_area : “,area_g_2)

   print(“blue_area  : “,area_b_2)

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

   

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

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

   if(area_r_2 > area_g_2 and area_r_2 > area_b_2):

       print(“赤色”)

   if(area_g_2 > area_r_2 and area_g_2 > area_b_2):

       print(“緑色”)

   if(area_b_2 > area_g_2 and area_b_2 > area_r_2):

       print(“青色”)

   if(area_b_2 == area_g_2 and area_b_2 > area_r_2):

       print(“水色”)

   if(area_r_2 == area_b_2 and area_r_2 > area_g_2):

       print(“紫色”)

   if(area_g_2 == area_r_2 and area_g_2 > area_b_2):

       print(“黄色”)

   if(area_r_2 == area_g_2 and area_r_2 == area_b_2):

       print(“灰色”)

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

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

 

   # 方針3 平均値算出 平均値以下足切り

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

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

   ave_r = mean(hist_r)

   ave_g = mean(hist_g)

   ave_b = mean(hist_b)

   area_r_3 = 0

   area_g_3 = 0

   area_b_3 = 0

   for i in range(256):

       if(i>0):

           if(hist_r[i] > ave_r):

               area_r_3 = area_r_3 + ((hist_r[i]+hist_r[i-1]*1)/2)

           if(hist_g[i] > ave_g):

               area_g_3 = area_g_3 + ((hist_g[i]+hist_g[i-1]*1)/2)

           if(hist_b[i] > ave_b):

               area_b_3 = area_b_3 + ((hist_b[i]+hist_b[i-1]*1)/2)

       else:

           area_r_3 = 0

           area_g_3 = 0

           area_b_3 = 0

 

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

   print(“red_area   : “,area_r_3)

   print(“green_area : “,area_g_3)

   print(“blue_area  : “,area_b_3)

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

   

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

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

   if(area_r_3 > area_g_3 and area_r_3 > area_b_3):

       print(“赤色”)

   if(area_g_3 > area_r_3 and area_g_3 > area_b_3):

       print(“緑色”)

   if(area_b_3 > area_g_3 and area_b_3 > area_r_3):

       print(“青色”)

   if(area_b_3 == area_g_3 and area_b_3 > area_r_3):

       print(“水色”)

   if(area_r_3 == area_b_3 and area_r_3 > area_g_3):

       print(“紫色”)

   if(area_g_3 == area_r_3 and area_g_3 > area_b_3):

       print(“黄色”)

   if(area_r_3 == area_g_3 and area_r_3 == area_b_3):

       print(“灰色”)

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

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

 

   # グラフ表示

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

   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()

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

   

 

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

 

実行結果

———-方針0———-

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

red_area   : 48400.0

green_area :  48400.0

blue_area  : 48400.0

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

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

画像の主要な色 : 

灰色

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

———-方針1———-

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

red_area   : 10599728.0

green_area :  4259789.0

blue_area  : 1016013.0

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

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

画像の主要な色 : 

赤色

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

———-方針2———-

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

red_area   : 1.004983388704319

green_area :  1.0136762519111147

blue_area  : 1.013379116852662

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

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

画像の主要な色 : 

緑色

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

———-方針3———-

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

red_area   : 24130.5

green_area :  48034.0

blue_area  : 24401.5

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

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

画像の主要な色 : 

緑色

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

 

う~ん, 全然ダメでした…

単色の画像以外だと

方針③, 方針①はいい結果をだしていました..方針②は全然ダメでした!

あと, ライブラリを使わないからやたら遅いです!

 

[今日の達成]

・方針を実行した

[今日の未消化]

・方針がうまくいかなかった..

 

Post a comment