BLOG

 

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

05 9月 2018, Posted by keisuke in IT留学, Python

こんばんわ!Keisukeです!

前回に引き続き画像を色分けした後に種類別のファイルに保存するコードに変更しました!

以下コード

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

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 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(“解析画像 : {0}”.format(file))

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

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

# ヒスとグラムに変換 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———-“)

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

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

 

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

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

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

f.write(“———-方針5———-“)

f.write(‘\n’)

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(“*************************************************”)

f.write(“*************************************************”)

f.write(‘\n’)

f.write(“R : {0}”.format(hist_r_max))

f.write(“range_R : {0}”.format(hist_r_max_range))

f.write(‘\n’)

f.write(“G : {0}”.format(hist_g_max))

f.write(“range_G : {0}”.format(hist_g_max_range))

f.write(‘\n’)

f.write(“B : {0}”.format(hist_b_max))

f.write(“range_B : {0}”.format(hist_b_max_range))

f.write(‘\n’)

f.write(“*************************************************”)

f.write(‘\n’)

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

print(color_dist_1)

f.write(color_dist_1)

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

# ファイル振り分け

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

print(“++++++++++++++++++++++++++++++++++++++++++++++++++++++++++”)

print(‘\n’)

print(“———–画像コピー———–“)

print(comparing_img_path)

print(“↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓”)

print((img_path + color_dist_1))

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

f.write(‘\n’)

# コピー時:同ファイルに同名のファイルがあるときエラーはでない?

#file_check = os.listdir((img_path + color_dist))

#for file_c in file_check:

#   if(file == file_c):

#       print(“同名のファイルがあります!{0} はコピーされません”.format(file))

#   else:

#       shutil.copy(comparing_img_path, (img_path + color_dist))

shutil.copy(comparing_img_path, (img_path + color_dist_1))

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

# グラフ表示

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

 

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

 

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

print(“———–解析終了———–“)

f.write(“———–解析終了———–“)

f.close()

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

実行結果

———–色分け用 ファイル作成———–

 

 

 

2018/09/04 23:00:30

解析画像数: 7

B.jpeg

G.jpg

hg4.jpg

hqdefault.jpg

input.png

R.jpeg

RGB.png

———–解析開始———–

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++解析画像 : B.jpeg

画素数_Y : 220

画素数_X : 220

画素   : 48400

———-方針4———-

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

ave_R : 21.0

ave_G : 88.0

ave_B : 219.0

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

blue

———-方針5———-

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

R : 48400range_R : 1

G : 48396range_G : 5

B : 48397range_B : 13

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

blue++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

———–画像コピー———–

C:\Python\picture\_irowake_/images/B.jpeg

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

C:\Python\picture\_irowake_/blue

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++解析画像 : G.jpg

画素数_Y : 225

画素数_X : 225

画素   : 50625

———-方針4———-

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

ave_R : 18.0

ave_G : 102.0

ave_B : 50.0

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

green

———-方針5———-

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

R : 41078range_R : 1

G : 48314range_G : 6

B : 39313range_B : 3

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

green

~~省略~~

画像をファイル別に保存できました!

やはり, 画像の容量が大きいと時間がかかりそうです…

 

[今日の達成]

・色分けした画像をファイル別に保存した!

[今日の未消化]

・画像の特徴量を抽出する

Post a comment