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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

8422閲覧

複数画像の結合の繰り返し処理

takeo_0811

総合スコア13

OpenCV

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/04/05 07:34

###ここに質問の内容を詳しく書いてください。
あるディレクトリ内の22500枚の66×66の画像を1500枚の1行×15列の990×60の画像に加工をし、あるディレクトリ内に保存たいと考えております。

発生している問題・エラーメッセージ

アウトプットが違う形でされてしまう。
(具体的には3文字がたてに並んでいるようなアウトプット)

エラーメッセージ なし ### 該当のソースコード ```ここに言語名を入力 python ソースコード import cv2, glob def concat_tile(im_list_2d): return cv2.vconcat([cv2.hconcat(im_list_h) for im_list_h in im_list_2d]) files = glob.glob(r"gazo/1_2/*.tif") for f in files: img = cv2.imread(f) my_list_for_arg = [list(row) for row in zip(*[iter(img)] * 15)] cv2.imwrite('test.tif', concat_tile(my_list_for_arg)) ### 試したこと pythonの勉強をし終わってから実務で急に使わないといけず、本当に頓珍漢な質問をしていると思います。 大変申し訳ありません。 やらいないといけないことは、 1.OpenCVを用いて各画像を読み込み、リストimgsを作る。 2.imgsの形状を適切に変形し、concat_tileに渡す。 3.返り値が目的の画像。 4.この処理を繰り返す だと思うのですが、 2の部分が理解をしないままインターネットで仕入れたコードをコピペして変えたためだと認識しております。 大変申し訳ありません。 cv2.hconcat([ ])も考えたのですが、引数のリスト内にどのように繰り返しのimg名を入れればよいかわからず、でした。 また、繰り返し処理をどのように記載すればよいかもわからず・・・。 2の部分をどうすればよいか、もしくは他に方法がある場合ご教示いただけますと大変幸いです。 ### 補足情報(FW/ツールのバージョンなど) windows7 python-3.6.4 opencv-3.4.1 ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

例えば、

01.png 02.png ... 12.png

のように連番になっている画像が 3x4 の以下の場所に対応する場合

01, 02, 03, 04, 05, 06, 07, 08 09, 10, 11, 12

以下のように結合すればよいです。
glob で読み込むパスと rows, cols のところは変更してください。

python

1import glob 2 3import cv2 4import numpy as np 5 6paths = glob.glob('output/*.png') # 画像のパス一覧 7 8# 画像を読み込む。 9imgs = np.array([cv2.imread(p) for p in sorted(paths)]) 10print(imgs.shape) 11 12# 画像の形状を変更する。 13h, w, c = imgs.shape[1:] 14rows, cols = 3, 4 # 結合前の画像が何行何列あるか 15imgs = imgs.reshape(rows, cols, h, w, c) 16 17merged = np.vstack([np.hstack(h) for h in imgs]) 18cv2.imwrite('merged.png', merged)

OpenCV - 画像をグリッド上に分割する方法について

追記

22500 枚の画像をすべて読みこんで、1つの配列としたら、
all_imgs = (22500, 66, 66, 3) という配列になると思います。
これを (1500, 15, 1, 66, 66, 3) という配列に reshape します。
あとは for で回して、結合→保存を繰り返せばよいです。

python

1def concat(imgs): 2 return np.vstack([np.hstack(h) for h in imgs]) 3 4# all_imgs は (22500, 66, 66, 3) という形状であることが前提 5# 形状を (22500, 66, 66, 3) から (-1, 1, 15, 66, 66 ,3) に変更する。 6all_imgs = all_imgs.reshape((-1, 1, 15, 66, 66 ,3)) 7for i, imgs in enumerate(all_imgs): 8 # imgs は (1, 15, 66, 66 ,3) という形状 9 merged = concat(imgs) 10 cv2.imwrite('{}.png'.format(i), merged)

投稿2019/04/05 08:14

編集2019/04/05 09:48
tiitoi

総合スコア21956

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

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

takeo_0811

2019/04/05 08:27

ありがとうございます。 大変申しわけありません。私の質問の仕方が悪く大変申し訳ありません。 1行15列のファイルを1500セット作りたく、そうなった場合どのような処理をすればよいかご教示いただくことは可能でしょうか?ご回答いただいたのに大変申し訳ありません。 今回、1500行×15列の1つのファイルということであれば作れそうです。本当にありがとうございます。
tiitoi

2019/04/05 08:31 編集

22500 枚の画像を読み込んで、15枚ずつ取り出して、結合する関数で結合して、保存を1500回繰り返せばよいのではないですか?
tiitoi

2019/04/05 08:54 編集

追記しました。 まず22500枚の画像を読み込んで、(22500, 66, 66, 3) という形状の numpy 配列を作ってください。 それが作れれば、あとは追記の通りにやればよいです。
takeo_0811

2019/04/05 09:34

本当に丁寧にありがとうございます。 本当に理解力がなく申しw変えありません・・・。 concatのところなのですが、concatでエラーが出てしまい、もし解決方法わかれば教えていただけませんでしょうか。。。?
tiitoi

2019/04/05 09:49

concat は結合する関数を想定していました。 追記のコードを修正しましたので、22500 枚の画像をディレクトリから読み込み、numpy 配列にし、(22500, 66, 66, 3) という形状であれば、あとは追記のコードで保存できると思います。 もし、できなかったら教えてください。
takeo_0811

2019/04/08 09:01

本当にありがとうございます。 先ほど試しましてできました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問