前提
以下のような手順で添付画像のような画像を出力したいと思っています。
- 読み込み リストフォルダ内の画像をOpenCVで読み込む
- 画像処理 Matplotで配置。縦2×横3の計6つの図を配置して保存。
- 繰り返し 7-12枚目の図で画像処理を繰り返す。
発生している問題
繰り返し構造に躓いています。画像(多次元配列)のリストから順次6つの画像を処理したいのですが、多次元配列の範囲選択の書き方がわかりません。アドバイスを頂けますと幸いです。
ソースコードの実行結果
エラーは特に表示されず、添付画像は出力できるので処理の1巡目は想定通り動いているように見えますが、それ以降の処理で7-10枚目の画像に移れない状態です。
該当のソースコード
python
1import os 2import cv2 3import glob 4import numpy as np 5from PIL import Image 6from natsort import natsorted 7from matplotlib import pyplot as plt 8from datetime import date 9 10#フォルダを指定してpngファイルを読み込む 11files = glob.glob("/Users/Desktop/input" + "/*.png") 12 13#pngファイルを読み込んでリストに格納 14imgs = [] 15for b in files: 16 img = Image.open(b) 17 img = np.asarray(img) 18 img = cv2.resize(img, (300, 300), cv2.INTER_LANCZOS4) 19 imgs.append(img) 20 21#初期値定義 22shownumber = 18 23#縦に配置する画像の枚数 24showaxis_row = 3 25#縦に配置する画像の枚数 26showaxis_col = 2 27 28 29#以下は画像処理 30 31###画像を格納したリストを範囲として定義(「詳細は試したこと」に記載) 32 33###Figとaxの定義,Figureに対して縦3*横2のaxesを配置 34fig, ax = plt.subplots(showaxis_row,showaxis_col, figsize=(8.27, 11.69)) 35for i in range(showaxis_row): 36 for j in range(showaxis_col): 37 ax[i, j].xaxis.set_major_locator(plt.NullLocator()) 38 ax[i, j].yaxis.set_major_locator(plt.NullLocator()) 39 ax[i, j].imshow(imgs[showaxis_row*i+j], cmap="bone") 40 if 2==i*j: 41 # plt.show() 42 plt.savefig("/Users/Desktop/output/"+str(a)+ ".jpg",dpi=200) 43
試したこと
下記のように範囲指定を試みましたが、7番目以降の画像を指定しようとしても同じ範囲をループしてしまいうまくいきませんでした。
# 1以下の行を挿入すると ax[0,0]だけに画像の配置されたFigureが19枚生成される。(33行目)
count_num = 0 a = 0 for a ,list_imgs in enumerate(imgs[count_num:shownumber]):
続けて以下のように範囲を指定しようとすると、[0,0]の位置にだけ画像が出力されたFigureが19枚出力される。
ax[i, j].imshow(list.imgs, cmap="bone")
#2以下の範囲指定だと6枚のFigureがjpgとして保存されるが全て最初の処理と同じ状態になる。 (33行目)
a = 0 for a in range(int(showaxis_row * showaxis_col / shownumber)):
実行環境について補足
MacOS Monetery 12.5.1
Python3
添付画像
あなたの回答
tips
プレビュー