'23/11/16更新:図例を見やすいのに差し替えたのとコードの可読性を若干向上しました。
本記事では、Pythonで複数の画像ファイル(jpg, png)を連結して1つの画像ファイルに保存する雛形コードを載せました。
下図は、8枚の画像ファイルを3列3行の位置に配置して、1枚の画像ファイルにした例です。下図例では列数は3ですが他の数字を指定できます。そして各行の左端と各列の上にテキストを挿入できます。
ライブラリは、matplotlibに加えて、OpenCV(cv2)とPillow(PIL)とNumpy(numpy)を使用します。
特に、Pillowを使用する理由は、OpenCVでは日本語ファイルパスを読み込めずにエラーになるためです(Noneを返す)。そして、Numpyを使用するのはひとつの画像に複数の画像を行列に整列する際に、上図の2行目の2列の2箇所のように埋めきらない場合に無地で代替するためです。
■本プログラム
import os, glob, re
import math
import cv2
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
def main():
myimg_list = glob.glob(r'./pictures/*.png')
output_file_path = 'test.jpg'
n_col = 3
filepath_list = sorted(myimg_list, key=lambda x:int((re.search(r"[0-9]+", x)).group(0)))
n_row = math.ceil(len(filepath_list) / n_col)
_, axs = plt.subplots(n_row, n_col, figsize=(8,6), tight_layout=True)
axs = axs.flatten()
sum = n_row * n_col
j = 1
for i in range(sum):
print(i+1, '/', sum)
if i < len(filepath_list):
print(filepath_list[i])
img = Image.open(filepath_list[i])
else:
img = np.zeros((1, 1, 3))
img += 255
img = np.asarray(img)
axs[i].imshow(img)
axs[i].axis('off')
if (i+1) <= n_col:
axs[i].set_title(f'{(i+1)}列目')
if i%n_col == 0:
axs[i].text(0, 0.5, f'{(j)}行目', rotation=90, ha='right', va='center', transform=axs[i].transAxes)
j += 1
plt.tight_layout()
plt.savefig(output_file_path,
format = os.path.splitext(output_file_path)[1][1:],
dpi=360)
if __name__ == "__main__":
main()
print('finished')
以上
<広告>
リンク
リンク
リンク