こんばんわ!Keisukeです!
今回は, 画像の色分けを某テレビアニメ, 某人気ゲームのキャラクターに適用してみたいと思います!
こちらから, 画像を引用させていただきました!
https://www.pokemon.jp/zukan/
画像のサイズも小さくて試用の解析にはもってこいの画像です!
事前に動作確認をしたところ, 方針5では混合色に上手く対応できずヒストグラムの計算にかなり時間がかかるため方針4の画素の平均値から判断します!
※最終的にヒストグラムを使用してないです…ヒストグラムの元になるデータを使用しています。
以下コード
**************************
import cv2
import numpy as np
from matplotlib import pyplot as plt
import os
import shutil
from datetime import datetime
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):
color = ‘red’
if(data_g > data_r and data_g > data_b):
color = ‘green’
if(data_b > data_g and data_b > data_r):
color = ‘blue’
if(data_b == data_g and data_b > data_r):
color = ‘skyblue’
if(data_r == data_b and data_r > data_g):
color = ‘purple’
if(data_g == data_r and data_g > data_b):
color = ‘yellow’
if(data_r == data_g and data_r == data_b):
color = ‘gray’
return color
”’
def distribute(data_r,data_g,data_b): # distribute(–R–,–G–,–B–)
print(“画像の主要な色 : ”)
if(data_r > int(data_g-float(data_r)*0.3) and data_r > int(data_b-float(data_r)*0.3)):
color = ‘red’
if(data_g > int(data_r-float(data_g)*0.3) and data_g > int(data_b-float(data_g)*0.3)):
color = ‘green’
if(data_b > int(data_g-float(data_b)*0.3) and data_b > int(data_r-float(data_b)*0.3)):
color = ‘blue’
if(data_b >= int(data_g+float(data_b)*0.3) and data_g >= int(data_b+float(data_g)*0.3) and data_b > data_r):
color = ‘skyblue’
if(data_r >= int(data_b+float(data_r)*0.3) and data_b >= int(data_r+float(data_b)*0.3) and data_r > data_g):
color = ‘purple’
if(data_r >= int(data_g+float(data_r)*0.3) and data_g >= int(data_r+float(data_g)*0.3) and data_g > data_b):
color = ‘yellow’
if(data_r == data_g and data_r == data_b):
color = ‘gray’
return color
”’
def fail_make(path):
color_red = path + ‘red’
os.mkdir(color_red)
color_green = path + ‘green’
os.mkdir(color_green)
color_blue = path + ‘blue’
os.mkdir(color_blue)
color_yellow = path + ‘yellow’
os.mkdir(color_yellow)
color_purple = path + ‘purple’
os.mkdir(color_purple)
color_skyblue = path + ‘skyblue’
os.mkdir(color_skyblue)
color_gray = path + ‘gray’
os.mkdir(color_gray)
if __name__ == “__main__”:
# コメントファイル作成
# ——————————————————————————–#
f = open(‘comment.txt’,’w’)
# ——————————————————————————–#
# ファイル作成
# ——————————————————————————–#
print(“———–色分け用 ファイル作成———–“)
f.write(“———–色分け用 ファイル作成———–“)
f.write(‘\n’)
img_path = os.path.abspath(os.path.dirname(__file__))+’/’
file_color = os.listdir(img_path)
dx = 0
for file in file_color:
if(‘red’==file or ‘green’==file or ‘blue’==file or ‘yellow’==file or ‘purple’==file or ‘skyblue’==file or ‘gray’==file):
print(“ディレクトリが既に存在しています”)
f.write(“ディレクトリが既に存在しています”)
f.write(‘\n’)
dx = dx + 1
if(dx == 0):
fail_make(img_path)
else:
print(“同名のファイルが {0} 個存在しています”.format(dx))
print(“7個未満の場合はファイルを削除または, 同ディレクトリから移動してください。”)
print(“7個の場合は処理を進めます。”)
f.write(“同名のファイルが {0} 個存在しています”.format(dx))
f.write(‘\n’)
f.write(“7個未満の場合はファイルを削除または, 同ディレクトリから移動してください。”)
f.write(‘\n’)
f.write(“7個の場合は処理を進めます。”)
f.write(‘\n’)
print(‘\n’)
f.write(‘\n’)
#shutil.copy(img_path + ‘irowake.py’,img_path + ‘red’)
# ——————————————————————————–#
# 時間取得
# ——————————————————————————–#
time_copy = str(datetime.now().strftime(“%Y/%m/%d %H:%M:%S”))
print(time_copy)
print(‘\n’)
f.write(time_copy)
f.write(‘\n’)
# ——————————————————————————–#
# 画像単体読み込み
#img = cv2.imread(‘input.png’)
# 画像読み込み
# ——————————————————————————–#
# 画像複数読み込み
img_dir = os.path.abspath(os.path.dirname(__file__)) + ‘/images/’
files = os.listdir(img_dir)
print(“解析画像数: “,len(files))
f.write(“解析画像数: {0}”.format(len(files)))
f.write(‘\n’)
for file in files:
if file == ‘.DS_Store’ :
continue
print(file)
f.write(file)
f.write(‘\n’)
print(‘\n’)
f.write(‘\n’)
print(“———–解析開始———–“)
f.write(“———–解析開始———–“)
f.write(‘\n’)
for file in files:
if file == ‘.DS_Store’ :
continue
comparing_img_path = img_dir + file
print(“++++++++++++++++++++++++++++++++++++++++++++++++++++++++++”)
print(“解析画像”,file)
f.write(“++++++++++++++++++++++++++++++++++++++++++++++++++++++++++”)
f.write(‘\n’)
f.write(‘\n’)
f.write(“解析画像 : {0}”.format(file))
f.write(‘\n’)
f.write(‘\n’)
img = cv2.imread(comparing_img_path)
print(“画素数_Y : “,len(img))
print(“画素数_X : “,len(img[0]))
print(“画素 : “,len(img)*len(img[0]))
f.write(“画素数_Y : {0}”.format(len(img)))
f.write(‘\n’)
f.write(“画素数_X : {0}”.format(len(img[0])))
f.write(‘\n’)
f.write(“画素 : {0}”.format(len(img)*len(img[0])))
f.write(‘\n’)
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])
# ——————————————————————————–#
# 方針4 画素値の合計 ※ヒストグラム未使用
# ——————————————————————————–#
print(“———-方針4———-“)
f.write(“———-方針4———-“)
f.write(‘\n’)
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 : {0}”,ave_r)
print(“ave_G : {0}”,ave_g)
print(“ave_B : {0}”,ave_b)
print(“*************************************************”)
f.write(“*************************************************”)
f.write(‘\n’)
f.write(“ave_R : {0}”.format(ave_r))
f.write(‘\n’)
f.write(“ave_G : {0}”.format(ave_g))
f.write(‘\n’)
f.write(“ave_B : {0}”.format(ave_b))
f.write(‘\n’)
f.write(“*************************************************”)
f.write(‘\n’)
color_dist_0 = distribute(ave_r,ave_g,ave_b)
print(color_dist_0)
f.write(color_dist_0)
f.write(‘\n’)
# ——————————————————————————–#
# ファイル振り分け
# ——————————————————————————–#
print(“++++++++++++++++++++++++++++++++++++++++++++++++++++++++++”)
print(‘\n’)
print(“———–画像コピー———–“)
print(comparing_img_path)
print(“↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓”)
print((img_path + color_dist_0))
f.write(“++++++++++++++++++++++++++++++++++++++++++++++++++++++++++”)
f.write(‘\n’)
f.write(“———–画像コピー———–“)
f.write(‘\n’)
f.write(comparing_img_path)
f.write(‘\n’)
f.write(“↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓”)
f.write(‘\n’)
f.write((img_path + color_dist_0))
f.write(‘\n’)
shutil.copy(comparing_img_path, (img_path + color_dist_0))
# ——————————————————————————–#
print(“———–解析終了———–“)
f.write(“———–解析終了———–“)
f.close()
**************************
実行結果
———–色分け用 ファイル作成———–
同名のファイルが 7 個存在しています
7個未満の場合はファイルを削除または, 同ディレクトリから移動してください。
7個の場合は処理を進めます。
2018/09/05 08:52:10
解析画像数: 17
09e0038e772171c0a2bfba83fa0a4a46.png
12a55f1d23bf3154fa96f8de7a9bf9da.png
1fa31f08a7ccbcf4e14ebcda9453f49e.png
2644995ebd067b9da27ed5be55a1eabf.png
48adee09c917295941aeab345a1d76e8.png
50e1e5bcc03516cd7735158a59b6957a.png
6a3807419a38c1de58a386550d9732f4.png
8f735bf2300fad236b27958af5b031db.png
8fe02d11dbc682860e83d37b767a0aea.png
9225bbc4c8c3cb9f09cd7933d11b1b2d.png
92a4a54cae0c0f80ab6eb470ae06b7ab.png
9bfdd1132f189decbd148465b1948dca.png
af8a7babcd19dbc4cde7dd4365f03bea.png
b7e469ec3112e5f93e0dee8c3129947c.png
cd9347786d24ade7fe2a2d6189e9cdf5.png
dbf141b51ca7f2438b4678978dc9e3f1.png
f029e2fc279c37482f0775d34b492ef1.png
———–解析開始———–
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
解析画像 : 09e0038e772171c0a2bfba83fa0a4a46.png
画素数_Y : 160
画素数_X : 160
画素 : 25600
———-方針4———-
*************************************************
ave_R : 199.0
ave_G : 203.0
ave_B : 204.0
*************************************************
blue
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
———–画像コピー———–
C:\Python\picture\_irowake_/images/09e0038e772171c0a2bfba83fa0a4a46.png
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
C:\Python\picture\_irowake_/blue
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
解析画像 : 12a55f1d23bf3154fa96f8de7a9bf9da.png
画素数_Y : 160
画素数_X : 160
画素 : 25600
———-方針4———-
*************************************************
ave_R : 224.0
ave_G : 220.0
ave_B : 212.0
*************************************************
red
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
———–画像コピー———–
C:\Python\picture\_irowake_/images/12a55f1d23bf3154fa96f8de7a9bf9da.png
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
C:\Python\picture\_irowake_/red
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
解析画像 : 1fa31f08a7ccbcf4e14ebcda9453f49e.png
画素数_Y : 160
画素数_X : 160
画素 : 25600
———-方針4———-
*************************************************
ave_R : 190.0
ave_G : 183.0
ave_B : 190.0
*************************************************
purple
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
———–画像コピー———–
C:\Python\picture\_irowake_/images/1fa31f08a7ccbcf4e14ebcda9453f49e.png
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
C:\Python\picture\_irowake_/purple
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
やはり, 混合色の解析はもう少し工夫をする必要があるようです!
試しに以下のようにしてみましたが…
・RGB→比較値と30%差があればR、G、Bに振り分ける
・混合色→比較値に30%を足し合わせて 比較範囲を広げた後, 振り分ける
def distribute(data_r,data_g,data_b): # distribute(–R–,–G–,–B–)
print(“画像の主要な色 : ”)
if(data_r > int(data_g-float(data_r)*0.3) and data_r > int(data_b-float(data_r)*0.3)):
color = ‘red’
if(data_g > int(data_r-float(data_g)*0.3) and data_g > int(data_b-float(data_g)*0.3)):
color = ‘green’
if(data_b > int(data_g-float(data_b)*0.3) and data_b > int(data_r-float(data_b)*0.3)):
color = ‘blue’
if(data_b >= int(data_g+float(data_b)*0.3) and data_g >= int(data_b+float(data_g)*0.3) and data_b > data_r):
color = ‘skyblue’
if(data_r >= int(data_b+float(data_r)*0.3) and data_b >= int(data_r+float(data_b)*0.3) and data_r > data_g):
color = ‘purple’
if(data_r >= int(data_g+float(data_r)*0.3) and data_g >= int(data_r+float(data_g)*0.3) and data_g > data_b):
color = ‘yellow’
if(data_r == data_g and data_r == data_b):
color = ‘gray’
return color
全てブルーに振り分けられてしまいました…
もっと考える必要がありそうです!
展望としては, 上記がコード上で難しければAIを組み込んで選別していけたらいいなって感じですね!
[今日の達成]
・実行速度を短縮した!
[今日の未消化]
・混合色の色分け
・AIの導入