LoginSignup
532

More than 5 years have passed since last update.

Excelで佐々木希を描く with python

Last updated at Posted at 2016-05-28

【環境】

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
532