Pythonでアイドルの顔を一覧表示する方法。Matplotlibを使って画像を一覧表示させてみた。

2021年6月19日

今回は好きなアイドルの顔を一覧表示して見比べる方法を紹介します。

前回記事でも似たようなプログラムを紹介しましたが、今回は画像の左上に連番表示ができるよう改良しました。しかも文字の色も変えられます。

プログラム紹介

以下のソースコードをみてください。

import cv2
import glob
import numpy as np
from PIL import Image
from natsort import natsorted
from matplotlib import pyplot as plt
# パラメータ
pm = 4
# 所定のフォルダ内にあるjpgファイルを連続で読み込んでリスト化する
files = glob.glob("./test_photo/idol/temp" + "/*.jpg")
# 空の入れ物を準備
d = []
# natsortedで自然順(ファイル番号の小さい順)1個づつ読み込む
for i in natsorted(files):
    img = Image.open(i)
    img = np.asarray(img)
    #img = cv2.resize(img, (400, 400), cv2.INTER_LANCZOS4)
    d.append(img)
# タイル状に画像を一覧表示させる
fig, ax = plt.subplots(pm, pm, figsize=(10, 10))
fig.subplots_adjust(hspace=0, wspace=0)
for i in range(pm):
    for j in range(pm):
        ax[i, j].xaxis.set_major_locator(plt.NullLocator())
        ax[i, j].yaxis.set_major_locator(plt.NullLocator())
        ax[i, j].text(20, 40, str((pm*i+j)), fontsize=10, color='red')
        ax[i, j].imshow(d[pm*i+j], cmap="bone")
plt.savefig('./test_photo/idol/temp/idol_16.png')
plt.show()

ソースコードの意味を順に説明します。

はじめに、必要なライブラリを import してください。

あとは前回記事で紹介したソースコードとほぼ同じです。

今回のポイントは以下のソースコードです。

ax[i, j].text(20, 40, str((pm*i+j)), fontsize=10, color='red')

まず、str() の中身で、( pm * i + j )と書いた部分で数字の連番表示ができるようにしています。

for 文の最初は i = 0 が代入されるので、最初のループでは i = 0 で j= 0~3 が代入されます。

つまり、以下となります。

  • i = 0 で j = 0 のとき pm * i + j = pm * 0 + 0 = 0
  • i = 0 で j = 1 のとき pm * i + j = pm * 0 + 1 = 1
  • i = 0 で j = 2 のとき pm * i + j = pm * 0 + 2 = 2
  • i = 0 で j = 3 のとき pm * i + j = pm * 0 + 3 = 3

同じように、i = 1 で j = 0~3 のときは以下となります。

  • i = 1 で j = 0 のとき pm * i + j = pm * 1 + 0 = 4 * 1 + 0 = 4
  • i = 1 で j = 1 のとき pm * i + j = pm * 1 + 1 = 4 * 1 + 1 = 5
  • i = 1 で j = 2 のとき pm * i + j = pm * 1 + 2 = 4 * 1 + 2 = 6
  • i = 1 で j = 3 のとき pm * i + j = pm * 1 + 3 = 4 * 1 + 3 = 7

以下同じように i = 3 までやると 15番まで表示されるようになります。

この手のソースコードで計算に迷ったら、実際に数字を当てはめてみるのが一番分かり易いです。

また、文字の色を決めている所は、color=’red’ の部分です。

’ ’ で囲んだ部分に色を英語で記載するとその色になります。

画像の背景に合わせて、一番目立つ色に指定すると文字が見やすくなると思います。

まとめ

  • ax[i, j].text() 関数の中で、color=’red’ と記載すると色を指定することができる。
  • 連番表示するには、pm * i + j と記載すればよい。

参考にした書籍