2020tlpa_stim.txt: 藤田ら(2000) の論文中に出てくる検査刺激 200 語の
  単語属性,単語のカテゴリ(10種類)と親密度(H,L)tlpa_data.json: 上記 2020tlpa_stim.txt を元に作成された json ファイル/Users/asakawa/study/2020cnps_aphasia/TLPA_naming_images/*.jpg: 呼称検査画像ファイル群tlpa_noun_data.pkl: 2020年1月7日に大門先生から送っていただいた名詞図版のデータtlpa_noun_imgs.npz: 同上の np.array の画像データtlpa_images.npz: 2020年2月に大門先生から送っていただいた図版を np.array 形式tlpa_images_data.pkl: 2020年2月に大門先生から送っていただいたデータの辞書形式データ/Users/asakawa/study/2020cnps_aphasia# 作業用ディレクトリを指定
Base_dir = '/Users/asakawa/study/2020cnps_aphasia/'
!printf "\n"
!pwd; 
!printf "\n"
!ls -lt tlpa*
#!ls -lt tlpa*
# 必要なライブラリの輸入
import numpy as np
import json
import codecs
import os
import sys
import glob
import pickle
from PIL import Image
import matplotlib.pyplot as plt
%matplotlib inline
# 自作の関数を輸入 numpy.array を json dump するための class NumpyEncoder
from utils import save_as_a_json
# 2020年1月7日に大門先生から送っていただいた TLPA 名詞図版の名前
tlpa_nouns = ["手", "パイプ", "糸", "灯台", "窓", "地図", "卵", "槍", "電話", "竜巻",
 "先生", "海苔", "カメラ", "シューマイ", "スカート", "プロレス","馬", "ロケット", "手紙", "綱",
 "バナナ", "湖", "テレビ", "楽譜", "新聞", "屏風", "車", "らくだ", "病院", "パイナップル",
 "太陽", "水着", "海", "算盤", "寿司",  "塀", "お金", "肘", "野球", "神主"]
# TLPA の各刺激の属性を表す辞書を定義
tlpa_feat = {"カテゴリー":
             {"I":"屋内部位", "E":"建造物", "A":"動物", "C":"色", 
              "F":"加工食品", "V":"野菜果物", "P":"植物", "T":"乗り物", 
              "B":"身体部位", "D":"道具"},
             "親密度":{"H":"高親密度", "L":"低親密度"}}
# 定義の確認
for k in tlpa_feat.keys():
    # 辞書に格納されている辞書項目の印刷
    print(k) 
    
    # 各辞書項目の示す内容は更に辞書になっている,
    # すなわち辞書の中に辞書が入れ子になっているからその内容を取り出す
    for kk, vv in tlpa_feat[k].items():
        print(kk, tlpa_feat[k][kk], end=', ')
    print()
## ファイル名の指定, 下記ファイルは論文に掲載されていた表から作成した
txt_file = os.path.join(Base_dir, '2020tlpa_stim.txt')
# 直上のファイルを読み込む
tlpa = {}
with codecs.open(txt_file, 'rb', encoding='utf-8') as f:
    l = f.readlines()
    
# 最初の200行は TLPA の属性データ    
for ll in l[:200]:
    a_entry = ll.strip().split(' ')
    tlpa[int(a_entry[0])] = {'Seq' :int(a_entry[0]),
                             'Cat':str(a_entry[1]),
                             'Fam':str(a_entry[2]),
                             'label':str(a_entry[3])}
#201 行目はその説明   
tlpa_description = json.loads(l[201])
#tlpa['Description'] = ind
# 出来上がったデータを json ファイルとして書き出し
save_as_a_json(tlpa, 'tlpa.json')
#tlpa.keys()
# 古い作業記録保持のために消していない。だが実行はしない
# tlpa_feat という辞書データとパワーポイントから作成したデータの対応表を作成
#i = 1
#transform_dict = {}
#for k in tlpa_feat.keys():
#    if no == "Descripiton":
#        break
#    #transform_dict[i] = (tlpa_feat[no]['Seq'], tlpa_feat[no]['Name'])
#    #transform_dict[k] = (tlpa_feat[k]['Seq'], tlpa_feat[k]['Name'])
#print(transform_dict)
# 古い作業記録保持のために消していない。だが実行はしない
# 大門先生からいただいた TLPA呼称画像ファイルが 4 分割されていた。
# それらの中には色名呼称検査に用いられる画像は含まれていないため,パワーポイントファイルから
# png 画像ファイルへと各画像を変換した際のファイル名に振られる連番と齟齬が発生するため
# 齟齬を吸収するための作業
#img_file_order = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
#                  21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
#                  39, 40, 41, 42, 43, 44, 45, 
#                  51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 
#                  69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 
#                  87, 88, 89, 90, 91, 92, 93, 94, 95, 
#                  101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
#                  116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
#                  131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145,
#                  151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165,
#                  166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180,
#                  181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195)
#
# ファイル名の連番から実際の TLPA 連番への変換表の作成 
#file2num = {i:transform_dict[j][0] for i, j in zip(img_file_order, tlpa_feat.keys())}
#file2num = {transform_dict[j][0]:i for i, j in zip(img_file_order, tlpa_feat.keys())}
#print(file2num)
#print(file2num[195]) # 200, すなわち Slide195.jpg は TlPA番号で 200 の `もみじ` の画像を指す
#print(file2num)
# 古い作業記録保持のために消していない。だが実行はしない
#img_root = os.path.join(Base_dir,'TLPA_naming_images/')
#for f in reversed(sorted(file2num.keys())):
#    src = 'Slide' + "{0:03d}".format(f) + '.png'
#    src = os.path.join(img_root, src)
#    dst = "{0:03d}".format(file2num[f]) + '.png'
#    dst = os.path.join(img_root,dst)
#    os.rename(src, dst)
#    #print(src, dst)
#for i, j in zip(img_file_order, tlpa_feat.keys()):
#    k = transform_dict[j][0]
for k in tlpa.keys():
    if k == "Description":
        break
    print('k:{0}: {1} {2} {3} {4}'.format(k, 
                                          tlpa[k]['Seq'], tlpa[k]['label'], 
                                          tlpa[k]['Cat'], tlpa[k]['Fam']))
"""
- 2020年2月11日に大門先生から送っていただいた画像の読み込み
- Original file names: 
    TLPA呼称図版1-50.pptx, TLPA呼称図版51-100.pptx, TLPA呼称図版101-150.pptx
    TLPA呼称図版151-200.pptx
- 上記 original file names の 4 ファイルを画像ファイル,形式 png にして保存した。
- 画像番号とファイル番号が食い違っていたため修正が必要
"""
image_basedir = os.path.join(Base_dir, 'TLPA_naming_images')
files = glob.glob(os.path.join(image_basedir,'*.png'))
#N = len(files)
N = 200 # TLPA の刺激数は全部で 200
max_width, max_height = 0, 0
for file in files:
    # ファイルの読み込み
    plimg = Image.open(file)
    
    # 最大,最小幅を計算
    bbox = plimg.getbbox()
    height, width = bbox[3] - bbox[1], bbox[2] - bbox[0]
    max_width = width if max_width < width else max_width
    max_height = height if max_height < height else max_height
# 上で計算した画面サイズの最大値を用いて numpy.array を定義
tlpa_imgs = np.zeros((N, max_height, max_width, 3), dtype=np.uint8)
for file in sorted(files):
    
    plimg = Image.open(file)  # file の読み込み
    if plimg.mode != "RGB":
        print(file, plimg.mode)
        plimg = plimg.convert("RGB")
    bbox = plimg.getbbox()  # 切り取り矩形領域の定義
    height, width = bbox[3] - bbox[1], bbox[2] - bbox[0]  # 画像の縦と横を計算
    img = np.asarray(plimg.crop(plimg.getbbox()), dtype=np.uint16)  # 顔像の切り取り実行
    
    # 画像ファイル名から検査図版番号を計算
    num = int(os.path.split(file)[-1].split('.')[0].replace('Slide','',1))
    
    # 画像データを tlpa_imgs へ格納
    tlpa_imgs[num - 1,:img.shape[0],:img.shape[1],] = np.copy(img)
    
    # データベースの更新
    tlpa[num] = {'id': num, 
                 'data': img if tlpa[num]['Cat'] is not 'C' else np.nan,
                 'label': tlpa[num]['label'], 
                 'file' : os.path.split(file)[-1],
                 'Cat' : tlpa[num]['Cat'],
                 'Fam': tlpa[num]['Fam'],
                }
"""
- 2020年2月21日に大門先生から送っていただいた色名呼称用画像の読み込み
- Original file names: 
    色.pptx
- 上記 original file names の 4 ファイルを画像ファイル,形式 png にして保存した。
"""
# 色情報画像ファイルの格納場所
color_basedir = os.path.join(Base_dir, '2020tlpa_color_imgs')
files = sorted(glob.glob(os.path.join(color_basedir,'*.png')))
max_width, max_height = 0, 0
for file in sorted(files):
    # ファイルの読み込み
    plimg = Image.open(file)
    
    # 最大,最小幅を計算
    width, height = plimg.size
    max_width = width if max_width < width else max_width
    max_height = height if max_height < height else max_height
print(plimg.size)
print(max_height, max_width)
print(files)
# 大門先生からいただいた色情報のパワーポイントファイルが 4 ページ
# だったので 4 枚の png 画像として書き出したデータを読み込む
# 全色データの表示    
fig = plt.figure(figsize=(12, 16))
for i, file in enumerate(files):
    ax = fig.add_subplot(4, 2, i+1)
    img = Image.open(file)
    img_ = np.asarray(img, dtype=np.uint8)
    ax.set_axis_off()
    ax.imshow(img_)
np.set_printoptions(precision=0)  # numpy.array の表示桁数を抑制
#img = Image.open('/Users/asakawa/study/2020cnps_aphasia/2020tlpa_color_imgs/Slide4.png')
# 上の画像データから色情報を読取るために,10枚の図版の位置を表す矩形領域を定義
fig = plt.figure(figsize=(12, 2))
boxes = {0:(100,  52, 139, 155),  # left, upper, right, lower
         1:(220,  52, 259, 155),
         2:(350,  52, 389, 155),
         3:(450,  52, 489, 155),
         4:(560,  52, 599, 155),
         5:(100, 252, 139, 355),
         6:(220, 252, 259, 355),
         7:(350, 252, 389, 355),
         8:(450, 252, 489, 355),
         9:(560, 252, 599, 355)}
# 上の結果から,切り出す画像領域の横と縦を計算
width, height = 139 - 100, 155 - 52
# 計算結果に基づいて numpy.array を用意
color_imgs = np.ndarray([4,10,height,width,3], dtype=np.uint8)
# 画像を表示させながら,色情報の平均値を計算
for i in range(4):
    fname = color_basedir + '/Slide' + str(i+1) + '.png'
    img = Image.open(fname).convert("RGB")
    plt.imshow(np.asarray(img, dtype=np.uint8))
    plt.show()
    print('card={}'.format(i))
    for j in range(10):
        print('img={} '.format(j), end="")
        img_cropped = img.crop(boxes[j])
        color_imgs[i][j] = np.copy(np.asarray(img_cropped, dtype=np.uint8))
        print('R:G:B=', end="")
        for k in range(3):
            #print('{0} '.format(np.mean(color_imgs[i][j][:][:][k],axis=0)),end=" ")
            #print('{0} '.format(np.mean(color_imgs[i][j][k],axis=0),end=""),end=" ")
            #print('{0} '.format(np.mean(color_imgs[i][j][:][:][k], axis=0)),end="")
            print('{0} '.format(np.mean(color_imgs[i][j][k], axis=0)),end="")
        print()
# 上で計算した結果に基づいて,データ辞書を作成
colors_dict = {
    0: {"RGB":[183,  51,  18], "Seq":97,  "label":"赤"},
    1: {"RGB":[252, 252, 252], "Seq":140, "label":"白"},
    2: {"RGB":[159,  73,  31], "Seq":158, "label":"茶色"},
    3: {"RGB":[178, 178, 178], "Seq":20, "label":"灰色"},
    4: {"RGB":[228, 139,  45], "Seq":81, "label":"オレンジ"},
    5: {"RGB":[241, 208, 215], "Seq":38, "label":"ピンク"},
    6: {"RGB":[ 31,  61, 129], "Seq":182, "label":"青"},
    7: {"RGB":[ 39, 134, 101], "Seq":2, "label":"緑"},
    8: {"RGB":[ 69,  53, 112], "Seq":56, "label":"紺"},
    9: {"RGB":[157, 144, 102], "Seq":64, "label":"金"},
    10:{"RGB":[ 68,  70,  67], "Seq":49, "label":"黒"},
    11:{"RGB":[ 76,  35,  15], "Seq":122, "label":"焦げ茶"},
    12:{"RGB":[254, 255, 217], "Seq":193, "label":"黄色"},
    13:{"RGB":[174, 176, 176], "Seq":115, "label":"銀色"},
#    14:{"RGB":[254, 255, 255], "Seq":115, "label":"銀色"},
    14:{"RGB":[200, 211, 156], "Seq":109, "label":"黄緑"},
    15:{"RGB":[199, 219, 245], "Seq":165, "label":"水色"},
    16:{"RGB":[163, 156, 187], "Seq":179, "label":"薄紫"},
    17:{"RGB":[254, 232, 209], "Seq":23, "label":"肌色"},
    18:{"RGB":[ 40,  17,  77], "Seq":143, "label":"紫"},
    19:{"RGB":[229, 137,  38], "Seq":76, "label":"黄土色"},
}
#colors_dict  # 表示させて確認
#colors_dict.keys()
# グラフ中の日本語がトーフになるので,その対策
import matplotlib.font_manager
fontprop = matplotlib.font_manager.FontProperties(fname="/Users/asakawa/Fonts/MS PGothic.ttf")
#fontprop = matplotlib.font_manager.FontProperties(fname="/Users/asakawa/Fonts/MS PMincho.ttf")
#print(Base_dir)
#print(color_basedir)
#print(image_basedir)
!ls /Users/asakawa/study/2020cnps_aphasia/TLPA_naming_images/*.png
#結果表示
fig, ax = plt.subplots(figsize=(10,14))
ax.axis('off')
# 画像格納用配列の準備
img = np.zeros_like(tlpa[1]['data'], dtype=np.uint8)
R, G, B = 0, 1, 2  # 色情報の格納位置
for k in colors_dict.keys():
    # パワーポイントファイルから書き出した画像情報に基づいて色情報データベースから色配列を作成
    img[:,:,R], img[:,:,G], img[:,:,B] = \
        colors_dict[k]['RGB'][R], colors_dict[k]['RGB'][G], colors_dict[k]['RGB'][B]
    # 色データの描画
    ax = fig.add_subplot(4, 5, k + 1)
    ax.set_axis_off()
    ax.imshow(img)
    ax.set_title('{0}: {1}'.format(colors_dict[k]['Seq'], colors_dict[k]['label']), 
                 fontdict = {"fontproperties": fontprop}, fontsize=12)
    
    # 色データを他の画像データと同じデータ内に保存
    colors_dict[k]['data'] = np.copy(img)
    Seq = colors_dict[k]['Seq']  # tlpa 番号の取得
    img_file = '{0:03d}.png'.format(Seq) # 書き出すファイル名を生成
    if tlpa[Seq]['Cat'] == 'C':
        if tlpa[Seq]['id'] != Seq:
            print('NG')
            sys.exit()
        tlpa[Seq]['data'] = np.copy(img)
        tlpa[Seq]['label'] = colors_dict[k]['label']
        tlpa[Seq]['file'] = img_file
    outfile = os.path.join(image_basedir,img_file)
    plt.imsave(outfile, tlpa[Seq]['data'])
    #print(outfile, tlpa[Seq]['Seq'], tlpa[Seq]['label'])
tlpa[2]['data'].shape
#help(plt.imsave)
# 確認作業
plt.imshow(tlpa[2]['data'])
#len(tlpa)
#tlpa[2]['id']
# 結果の保存
# 画像 numpy.array を .npz ファイルに保存
np.savez_compressed('tlpa_imgs.npz', tlpa_imgs)
# 読み戻し
tlpa_imgs_ = np.load('tlpa_imgs.npz')['arr_0']
# 全データを json ファイルに保存
save_as_a_json(tlpa, 'tlpa.json')
# 全データを pickle ファイルに保存
with open('tlpa.pkl', 'wb') as f:
    pickle.dump(tlpa, f)
# グラフ中の日本語がトーフになるので,その対策
import matplotlib.font_manager
fontprop = matplotlib.font_manager.FontProperties(fname="/Users/asakawa/Fonts/MS PGothic.ttf")
#fontprop = matplotlib.font_manager.FontProperties(fname="/Users/asakawa/Fonts/MS PMincho.ttf")
def display_a_image(num=None, dic=tlpa):
    """
    画面に一枚の画像を表示する関数
    num: 指定がなければランダムに一枚の画像を提示
    """
    if num == None:
        [num] = np.random.randint(low=1,high=1+len(dic), size=1)
    else:
        if num > len(dic):
            print('num:{0} exceeded the size of dict {1}'.format(num, len(dic)))
            return
    fig, ax = plt.subplots(figsize=(3,6))
    ax.imshow(dic[num]['data'])
    ax.axis('off')
    ax.set_title('{0}: {1}'.format(num, dic[num]['label']), 
                 fontdict = {"fontproperties": fontprop}, fontsize=28)
    plt.show()
#num = 2
#display_a_image(num)
display_a_image()
#len(TLPA_imgs)
# 全データの表示    
fig = plt.figure(figsize=(16, 200))
for k in tlpa.keys():
    ax = fig.add_subplot(40, 5, k)  # 縦,横,通し番号 
    ax.set_axis_off()
    ax.imshow(tlpa[k]['data'])
    # タイトルを設定
    #s = "{0}: {1}".format(i+1,tlpa_feat[i+1]['Name'])
    s = "{0}: {1}({2})".format(k, #tlpa_data[k]['Seq'], 
                               tlpa[k]['label'],
                               tlpa[k]['file'])
    ax.set_title(s, fontdict = {"fontproperties": fontprop}, fontsize=14)
plt.show()    
#type(TLPA_data)
#len(TLPA_data)
#TLPA_data.keys()
#type(TLPA_data[1])
#TLPA_data[2].keys()
tlpa.keys()
num = 2
for k in tlpa[num].keys():
    if k is not 'data':
        print('{}: {},'.format(k, tlpa[num][k]), end=' ')
tlpa_nouns = ["手", "パイプ", "糸", "灯台", "窓", "地図", "卵", "槍", "電話", "竜巻",
 "先生", "海苔", "カメラ", "シューマイ", "スカート", "プロレス","馬", "ロケット", "手紙", "綱",
 "バナナ", "湖", "テレビ", "楽譜", "新聞", "屏風", "車", "らくだ", "病院", "パイナップル",
 "海", "塀", "太陽",  "算盤", "寿司", "水着","お金", "肘", "野球", "神主"]
TLPA_nouns_dict = {i+1:n for i, n in enumerate(tlpa_nouns)}
print(TLPA_nouns_dict)
noun_images_basedir = os.path.join(BASE_DIR, 'TLPA_noun_images/')
path = glob.glob(os.path.join(noun_images_basedir,'53188-*.jpg'))
TLPA_noun_data = {}
max_width, max_height = 0, 0
for file in path:
    img = Image.open(file)
    width, height = img.size
    max_width = width if max_width < width else max_width
    max_height = height if max_height < height else max_height
    img = img.convert("RGB") if img.mode == "L" else img
    npimg = np.array(img, dtype=np.uint16)
    num = int(os.path.split(file)[-1].split('.')[0].replace('53188-','',1))
    TLPA_noun_data[num] = {'label':TLPA_nouns_dict[num], 
                           'data':npimg,
                           'file':file}
print('max_width:{0}, max_height:{1}, len(path):{2}'.format(max_width,max_height,len(path)))
tlpa_noun_imgs = np.ndarray((len(path),max_height, max_width,3), dtype=np.uint16)
for k in sorted(TLPA_noun_data.keys()):
    tlpa_noun_imgs[k-1] = np.copy(TLPA_noun_data[k]['data'])
# 名詞図版データ結果の書き出し
tlpa_noun_data_pkl_file = 'tlpa_noun_data.pkl'
with open(tlpa_noun_data_pkl_file, 'wb') as f:
    pickle.dump(TLPA_noun_data, f)
# 上で書き出した結果を読み込んで確認
with open(tlpa_noun_data_pkl_file,'rb') as f:
    a = pickle.load(f)
print(a[1]['label'])
plt.imshow(a[1]['data'])
plt.show()
        
num = 8
fig = plt.figure(figsize=(4,6)) # 横,縦の順
ax = fig.add_subplot(1,1,1)
ax.set_axis_off()
ax.imshow(TLPA_noun_data[num]['data'])
ax.set_title('{0}: {1}'.format(num, TLPA_noun_data[num]['label']), 
             fontdict = {"fontproperties": fontprop}, fontsize=24)
plt.imshow(TLPA_noun_data[num]['data'])
plt.show()
#plt.imshow(tlpa_noun_imgs[num-1]); plt.show()
fig = plt.figure(figsize=(16, 64))
i = 1
for k in sorted(TLPA_noun_data.keys()):
    ax = fig.add_subplot(10, 5, i)  # 縦,横,通し番号 
    ax.set_axis_off()
    ax.imshow(TLPA_noun_data[k]['data'])
    
    # タイトルを設定
    ax.set_title('{0}: {1}'.format(k,TLPA_noun_data[k]['label']), 
                 fontdict = {"fontproperties": fontprop}, fontsize=24)
    i += 1
plt.show()    
# 名詞図版画像データの書き出し
tlpa_noun_images_file = 'tlpa_noun_imgs.npz'
np.savez_compressed(tlpa_noun_images_file, tlpa_noun_imgs)
# 上で書き出した結果の再読み込み表示
tlpa_nouns_imgs_ = np.load(tlpa_noun_images_file)['arr_0']
no = 10
print(tlpa_nouns[no])
plt.gray()
plt.imshow(tlpa_nouns_imgs_[no])
plt.show()
以上お疲れさまでした
def gray2RGB(image_file):
    _a = Image.open(image_file)
    if _a.mode is "L":
        return _a.convert("RGB")
    else:
        return _a
def convertRGB(nparray):
    return np.asarray(Image.fromarray(nparray).convert("RGB"))