pythonでエクセルシートのデータ(CSVデータ)を画像化

pythonでエクセルシートのデータ(CSVデータ)を画像化します。

インプットのデータでは各セルに数値(実数値)が入っており、各セルを一つのピクセルとして数値は輝度値に変換します。

import numpy as np
import csv

# 画像の読み込み
with open('xxx.csv') as f:
    reader = csv.reader(f)
    l = [row for row in reader]

# ヘッダ部分を削除
l_img = []
for l in l[22:]:
    # 欠損値はnanで処理
    l_img.append( np.array( [ np.nan if x == '' else float(x) for x in l ] ) )

読み込んだ各行の列数が一致していることを一応確認します。

img_len = np.array( [ len(x) for x in l_img ] )
print( np.max( img_len ) )
print( np.min( img_len ) )

画像のため、配列を二次元に変換しています。行列のサイズも確認しておきます。

im = np.array( l_img ).flatten().reshape( len(l_img),-1 )
print( np.shape( im ) )

imの配列中の値の分布などを確認します。

import seaborn as sns
import matplotlib.pyplot as plt

mask = ~np.isnan(im)

sns.distplot(im[mask])
print( np.max( im[mask] ) )
print( np.min( im[mask] ) )

uint16の整数に変換します。今回は、元のデータが-6-+6だったので、その値が0-65,535になるよう調整します。

# uint16, 0-65,535
im_conv = np.uint16( 255*255*(im/12.+0.5) )
sns.distplot( im_conv[mask] )
print( np.max( im_conv[mask] ) )
print( np.min( im_conv[mask] ) )

バイナリとして保存します。リトルエンディアン(<)でunsigned shortです(H)。保存したrawファイルは別のプログラムとかで使用するつもり(Image-Jとか)。

im_conv.astype('<H').tofile('output.raw')

numpy配列をPillowを使って処理します。可視化まで実施です。

from PIL import Image

pilOUT = Image.fromarray(im_conv) 
pilOUT.show()

参考にしました

PythonでCSVファイルを読み込み・書き込み(入力・出力) | note.nkmk.me

Pythonの画像処理ライブラリPillow(PIL)の使い方 | note.nkmk.me

NumPyのarrayとPILの変換 - white wheelsのメモ

numpy.ndarrayのファイル保存(読み込み/書き込み対応表付き) | Python-izm

エンディアンについて - Qiita