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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

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

Q&A

解決済

2回答

1046閲覧

pythonの画像の結合

xeno

総合スコア16

Python 3.x

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

0グッド

0クリップ

投稿2022/02/25 02:28

一度分割した画像を再度結合したいのですが、結合する画像の数が多い時に下記のコードでは21行目から24行目の結合する部分の行数が多数になってしまうのでfor文などで何とか省略したいです。縦横の分割数は分かっています。
どなたかご教授願います。

import cv2 import glob import numpy as np from PIL import Image from natsort import natsorted # 所定のフォルダ内にある jpg ファイルを連続で読み込んでリスト化する files = glob.glob("./output/" + "/*.jpg") print(files) # 空のリストを準備 d = [] # natsortedで自然順(ファイル番号の小さい順)に1個づつ読み込む for i in natsorted(files): img = Image.open(i) # img は'JpegImageFile' object img = np.asarray(img) # np.asarrayで img を ndarray に変換 d.append(img) # d にappend で img を追加 print(d) # 画像の高さ方向と幅方向を結合 img_x = np.vstack((np.hstack(d[0:3]), np.hstack(d[3:6]), np.hstack(d[6:9]) )) # 色をBGR から RGB に変更 img_x = cv2.cvtColor(img_x, cv2.COLOR_BGR2RGB) cv2.imshow('img_after', img_x) cv2.imwrite('./result.jpg', img_x) cv2.waitKey(0) cv2.destroyAllWindows()

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

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

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

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

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

xeno

2022/02/25 03:07

やりたいことは近いように思いますが、最終的な結論が出ないままになっているようですので残念ながらあまり参考になりそうにないです。
guest

回答2

0

ベストアンサー

全ての画像のサイズとカラーチャネル数が同じである場合。

python

1# 画像の高さ方向と幅方向を結合 2w, h, c = d[0].shape 3N, M = 3, 3 4img_x = ( 5 np.concatenate(d[:N*M], axis=0) 6 .reshape(N, M, w, h, c) 7 .transpose([0, 2, 1, 3, 4]) 8 .reshape(h * N, w * M, c))

以下の様にしても同じ結果になります(こちらの方が理解しやすいかもしれません)。

python

1N, M = 3, 3 2lst = range(0, N*M+1, M) 3img_x = np.vstack(np.hstack(d[i:j]) for i, j in zip(lst, lst[1:]))

投稿2022/02/25 05:38

編集2022/02/25 07:24
melian

総合スコア19618

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

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

xeno

2022/02/25 07:53

ありがとうございます。 できました。
guest

0

たとえば、9つのデータを3x3に並べるのであれば、reshapeすればいいのではないですかね

python

1img_x = np.hstack(d).reshape(3, 3)

投稿2022/02/25 03:17

TakaiY

総合スコア12666

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

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

xeno

2022/02/25 03:29

21行目から24行目を img_x = np.hstack(d).reshape(3, 3) に変更するということですよね? 540×540の画像を9分割したもので実行すると下記のエラーになってしまうのですが修正箇所が違いましたか? ValueError: cannot reshape array of size 874800 into shape (3,3)
TakaiY

2022/02/25 04:12

874800個もあるデータを 3 × 3 には並べられないからですね。 何かまちがえているのでは?
TakaiY

2022/02/25 04:19

img_x = np.hstack(d[0:9]).reshape(3, 3) 12~24のものを、そっくりそのままやるのであれば、こうですが、残りのデータは不要なのでしょうか? そもそも、提示されているコードは、望み通りの結果になっているんですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問