質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Q&A

0回答

431閲覧

多次元配列の繰り返し

mtf

総合スコア0

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

0グッド

0クリップ

投稿2023/01/21 03:13

編集2023/01/26 05:16

前提

以下のような手順で添付画像のような画像を出力したいと思っています。

  • 読み込み リストフォルダ内の画像を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

添付画像

フォルダの画像が18枚ならこれを3つ、30枚なら6つ生成できる状態が理想です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2023/01/21 09:44

> 2周目以降のFigureがうまく生成されません。 「うまく生成されません」とは具体的にはどういう状況でしょうか?
mtf

2023/01/23 09:01

ありがとうございます。ソースコード実行後の結果は以下のようになります。 ・添付画像のようなjpgが1点生成される。 ・ターミナル上にエラーコードは発生せず、実行後は元に戻る。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問