Edited at

Excelで佐々木希を描く with python

More than 1 year has passed since last update.


【環境】

 windows8.1

 Excel 2013

 python2.7

 opencv3


【概要】

 佐々木希の写真から色の情報を取得して、Excelのセルに塗りつぶします。


【フォルダ構成】

 |---sasaki_excel

      |---sasaki_excel.py

      |---sasaki_nozomi.jpg(佐々木希の画像)

      |---sasaki_nozomi.xlsx(描画用のエクセル)

 こちらの画像を使用しました。

 sasaki_nozomi.jpg


【プログラム】


sasaki_excel.py

# -*- coding:utf-8 -*-


import cv2
from openpyxl import load_workbook
from openpyxl.styles import PatternFill

# 画像読み込み
image = cv2.imread("sasaki_nozomi.jpg")

# エクセルファイル読み込み
wb = load_workbook(filename='sasaki_nozomi.xlsx')
# アクティブなシートを取り出す
ws = wb.active

# アスキーコードを使ってアルファベットのリスト作成
# col_name = ['A','B',...,'Z']
col_name = [chr(i) for i in range(65,65+26)]

# エクセルの列名リスト作成
i = 0
for j in xrange(26, len(image[0])):
# アルファベットの連結
col_name.append(col_name[i] + col_name[j % 26])
if (j + 1) % 26 == 0:
i += 1
if len(col_name) == len(image[0]):
break

for gyo in xrange(len(image)):
for retu in xrange(len(image[gyo])):
for rgb in xrange(len(image[gyo][retu])):

# 赤、緑、青の値を16進数へ変換
# 16進数にすると'0x**'と変換されるため後ろ2文字を取り出す
red = hex(image[gyo][retu][0])[2:4]
# 例えば'0xc'と変換される16進数もあるため、0を連結
if len(red) == 1:
red = '0' + red
green = hex(image[gyo][retu][1])[2:4]
if len(green) == 1:
green = '0' + green
blue = hex(image[gyo][retu][2])[2:4]
if len(blue) == 1:
blue = '0' + blue

# 列と行の幅を変更
ws.column_dimensions[col_name[retu]].width = 0.3
ws.row_dimensions[retu].height = 1.5

# 塗りつぶすセル名を取得
cell_name = col_name[retu] + str(gyo + 1)
# セル名をセット
cell = ws[cell_name]
# 16進数の数字を文字連結
color = str(blue) + str(green) + str(red)
# 塗りつぶし
cell.fill = PatternFill(patternType='solid', fgColor=color)

# エクセルファイル保存
wb.save('sasaki_nozomi.xlsx')



【結果】

sasaki_nozomi.png

決して画像を貼りつけたわけではありませんよ(笑)

セルの幅は手動で調整しました。

[2016.5.29 追記]

セルの幅の調節を手動ではなくプログラムに組み込みました。

このプログラムの応用としては2枚の画像に対してセルの色を比較して、間違い探しをすることができます。


【参考サイト】

 PythonからExcelファイルをいじるopenpyxl

 アスキーコード表


【他言語版】

 Node.js版はこちら

 Ruby版はこちら