こんばんわ!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で再現する
・複数の画像を一度に処理する