538
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Excelで佐々木希を描く with python

【環境】

 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版はこちら

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
538
Help us understand the problem. What are the problem?