こんばんわ!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
*************************************************
*************************************************
画像の主要な色 :
緑色
*************************************************
う~ん, 全然ダメでした…
単色の画像以外だと
方針③, 方針①はいい結果をだしていました..方針②は全然ダメでした!
あと, ライブラリを使わないからやたら遅いです!
[今日の達成]
・方針を実行した
[今日の未消化]
・方針がうまくいかなかった..