baruthのメモblog

物忘れのひどいPython初心者がメモ代わりに書いてます

後から振り返るときの個人的覚書として。

1. DeepLearningの勉強と実験、捗ってない。自分の技術は2.5年前から進捗なし。もっと理解と実践に没頭したい。

2. 最近、Go言語の勉強始めた。ちょっと改良されたC言語みたいな印象。公式からDLしたzipを適当なところに展開してとりあえず%GOPATH%を設定すれば使えるので、軽い環境好きな自分に合ってる。コンパイルすると1つのexeに纏まるところも好き。今後はPythonとGoの二刀流で行こう。

3. RaspberryPi のGPIOに物理ボタンを付けて、長押しで電源off,短押しでaquestalkpi使ってIPアドレスを喋るようにしたらとても便利! たったこれだけの事でも、ケース孔加工,モメンタリのボタン選び,はんだ付けと配線,Pythonのスクリプト作成,自動起動の設定など勉強になり面白かった。

以上

pythonで作ったプログラムのexe化はその方式上、exeファイルサイズがかなり大きくなるので、ファイルサイズ抑制方法のメモ。

1. 画像の単純な読み書き程度ならば、OpenCVよりPIL(Pillow)を使ったほうが、約20MB程度小さくできた。

2. numpyを使用するならば、MKLを使わないnumpyのほうが、ファイルサイズを小さくできる(ファイルサイズの差は失念)。MKL不使用による計算速度の低下は(baruthのとある例では)5~7%。状況により許容可能。

3. 種々のモジュールをインストールした普段の開発環境下より、クリーンな環境に必要モジュールだけインストールしてexe化したほうが、ファイルサイズを小さくできる。
この記事のScriptをexe化した場合、
 (1)開発環境: 602 MB (WinPython 3.7.6 + openpyxl 3.0.3 + PyInstaller 3.6)
 (2)クリーン環境:22 MB (ver.は同上。※ただしWinPythonはdot版)
また、クリーン環境の使用はPyInstallerによるexe化の際の「Recursion error : maximum recursion depth exceeded」エラー回避にも有効。

画像をExcelのセルで表現してみたいと思い付き、openpyxl で遊んでみました。
画像の1ピクセル=Excelの1セルとして色を設定していきます。

from PIL import Image
import openpyxl as pxl
import tkinter
import tkinter.filedialog
import os

# ファイル選択ダイアログ
root = tkinter.Tk()
root.withdraw()
fTyp = [('画像ファイル','*.jpg;*.png;*.bmp')]
file = tkinter.filedialog.askopenfilename(filetypes=fTyp)

if len(file) != 0:
    img = Image.open(file)    # 画像読み込みとサイズ取得
    height = img.height
    width  = img.width
    
    wb = pxl.Workbook()    # 新規にExcelファイル生成
    ws = wb.active
    ws.title = os.path.basename(file)
    
    for yy in range(height):    # pixel色をcell色に反映
        for xx in range(width):
            color = img.getpixel( (xx, yy) )  # pixel色取得
            cell_color = ( '{:02x}{:02x}{:02x}'.format(color[0], color[1], color[2]) )  # 16進数文字列
            fill = pxl.styles.PatternFill(patternType='solid', fgColor=cell_color)  # cell色
            ws.cell(row=yy+1, column=xx+1).fill = fill  # cell色の変更,row,columnは1から始まる
    # 保存
    wb.save('color.xlsx')
else:
    print('ファイル選択をキャンセルしました.')


今回は行っていませんが、セルに数値(例えば99)を代入するには
ws.cell(row=yy+1, column=xx+1).value = 99
または
ws.cell(row=yy+1, column=xx+1, value=99)
とします。

ここから何か面白い使い方ができるか?は模索中です。
案として
1. 画像の輝度値もセルに書き出し、画像処理入門者(ピクセルのイメージが掴みにくい方)にExcelでconvolution処理などを体感してもらう。
2. 一番左に2列挿入し、A列には上から順に0,1,2,...と入力、B列には乱数式(=RAND())を代入。セル全体をB列でソートしたのちB列を削除 → 絵は一見ぐちゃぐちゃになるが、A列でソートして復元。
とか...

↑このページのトップヘ