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のメモ