画像を指定したサイズに分割して保存し、分割した画像を結合するプログラムを作成しています。
画像を指定したサイズに分割し保存ところまではできていますが結合するところができません。
調べたのですが分割する枚数が決まっているものしか見つからず上手くいきません。
from pathlib import Path from PIL import Image import cv2 import numpy as np def get_paths(input_dir, exts=None): paths = sorted([x for x in input_dir.iterdir()]) if exts: paths = list(filter(lambda x: x.suffix in exts, paths)) return paths # ディレクトリ内の指定した拡張子のファイルをすべて取得する。 input_dir = Path(r"/home/practice/img/") # 出力先のディレクトリを作成する。 output_dir = Path(r"output") output_dir.mkdir(exist_ok=True) for path in get_paths(input_dir, exts=[".jpg", ".jpeg", ".png"]): # 画像を読み込む。 img = cv2.imread(str(path)) size = (100, 100) # 分割後の大きさ rows = int(np.ceil(img.shape[0] / size[0])) # 行数 cols = int(np.ceil(img.shape[1] / size[1])) # 列数 patchs = [] for row_img in np.array_split(img, rows, axis=0): for patch in np.array_split(row_img, cols, axis=1): patchs.append(patch) #print(type(patch)) print(len(patchs)) # 保存する。 for i, patch in enumerate(patchs): #save_path = output_dir / f"patch_{i:02d}.png" #save_path = output_dir / f"{file_name}patch_{i:02d}.png" #cv2.imwrite(str(save_path), patch) # 結果を保存する。 save_path = output_dir.name + "/" + str(i) + "_" + path.name cv2.imwrite(str(save_path), patch)
「調べたのですが分割する枚数が決まっているものしか見つからず」とのことですが、縦がいくつ、横がいくつ、などの情報がわかっていなければ結合できないのでは?
ファイルが12こあったとして、それを、どのように結合したいのですか?、
ファイルは画像ファイルということで話を進めます。
画像ファイルがIMG_1.jpgからIMG_12.jpgの12個あったら、IMG_1.jpgからIMG_12.jpgを縦横サイズ100で分割し保存する。
そのあと、分割した画像を元の画像と同じように結合したいです。
各画像の元々のサイズはバラバラですが100で割り切れるもののみしかないです。
なぜ分割したいのかがわかりません。
分割して結合して元の画像を復元したいなら、そもそも分割しなければ良いでしょう。
質問の意図が伝わってませんでしたね。
「分割した画像を元の画像と同じように結合したい」ですよね
たとえば、分割された画像が12枚だったとしたら6通りの復元方法がありますよね。 ということは、元に戻すには少なくとも縦横の分割数がわからなければなりませんし、そうであれば、すてにやりかたは知っているということになりませんか?、
TakaiYさん
おっしゃっていた意味は理解できました。
こちらも聞きたいことを具体的に書けていませんでした。
毎回異なる画像を分割した際に縦横の分割数の記録と分割数に合わせた結合のやり方を聞きたかったです。
そもそも 分割→結合 を行うことの目的自体が全く不明(なぜかそのことには答えたくない様子?)であるので,どういう話をしているのかが不明と見えます.
具体的に話の 前提/条件 を述べるべきではないのでしょうか.
「結合」に際してどれだけの情報を 利用できる/利用してよい という話なのか?
言い換えれば,「分割」結果としてどれだけの情報を残してよいのか?
分割時に情報を欲しいだけ残してそれを結合時に用いて良いということであれば「いくらでも好きな方法で必要な情報をどこかに保存すれば良いだけ」という話にしかなりません.
しかし,例えばプログラムにジグソーパズルを自動で解かせるかのような,何らかのアルゴリズムで結合方法を推定するような話なのであれば話は全然違ってくるでしょう.
N枚の画像について各画像を 100x100 サイズの部分画像群に分割した結果の画像群が,あるフォルダ内に保存されている.
・Nの値は不明
・元のN枚の画像それぞれの元のサイズは不明(ただし縦横共に100の倍数ということだけは既知)
・フォルダ内の各100x100サイズ画像が元々どの画像のどこの位置だったのかは全く情報が与えられない
・(とりあえずフォルダ内には他の余計な物はないものとする)
という条件下でN枚の画像を復元せよ.
…みたいな話かもしれないし.
(シュレッダーのゴミから文書を復元するかのような)
fanaさん
画像を分割し、結合を行う間には機械学習の学習済みモデルを通します。
学習済みモデルは画像のサイズ100×100で学習しているのでそのサイズに分割したいです。
なので、流れとしては
画像を分割→分割した画像群をモデルに入力→モデルからの出力を結合
という流れです。
PCのスペックの関係で学習時の画像サイズは変えられません。
今回ご教授頂きたいのは分割した画像を結合する部分なので、分割した画像群をモデルに入力の部分は必要ないと判断したため省きました。
結合時には縦横の分割数は分かっています。
fanaさん
使用する機械学習のモデルはノイズ除去を行うものなので、出力される画像は入力画像と同じサイズです。
とりあえず意味はわかりました.
小画像群がその絵毎に更新される→くっつける という話ですね.
そうです
聞きたいこと以外の情報は省いてしましました
申し訳ありません
回答1件
あなたの回答
tips
プレビュー