Javaでフォトモザイクを作成しています。これへの入力は、ターゲット イメージとタイルのコレクションです。以下は同じための私のアルゴリズムです:
a. Read all the tiles from the directory and process* it. [Every tile is of the same dimension.]
b. Read the target image, break it into cells [cells are of dimensions of a tile.]
c. Process* all the cells.
d. For each cell:
d.1. Create a HashMap h [where key=euclidean metric, value=corresponding tile]
d.2. For each tile:
d.2.1 Calculate Euclidean metric.
d.2.2 add it to h.
d.3 Calculate min from h.
d.4 Add the min to an outputList
e. Create the image from list of images in the outputList.
*process メソッドは画像を取り込み、定義した というクラスのオブジェクトを作成しますImageDetails
。そのため、処理されるすべてのタイルとセルに対してImageDetails
、RGB 値や寸法などの詳細を格納するオブジェクトが作成されます。オブジェクトには 2 つの個別のリストがあります。1 つは 用tiles
、もう 1 つは 用cells
です。
問題は、平均して約 300 個のタイルと 50,000 個ものセルがあることです (それ以上になることもあります)。したがって、プログラムの実行中は、実行する計算やその他の ip/op 操作に加えて、これらの多くのオブジェクトがメモリ内に保持されます。
リソースが少ない (使用可能なメモリが少ない) マシンでこのプログラムを実行すると、作成される出力イメージが歪んでしまいます。しかし、より多くの利用可能なリソースを備えたマシンで実行すると、完璧です。利用可能なリソースがない場合、一度にすべてのオブジェクトをメモリに保持できないためだと思います。そのため、タイルの配置が間違っている画像が表示されます。しかし、十分なメモリがあれば、完璧な出力画像が表示されます。
使用可能なメモリに関係なく、追加された要素の順序を保持して、outputList
歪みのない画像を表示できるようにするにはどうすればよいですか。
ありがとう。
編集:
以下は、同じプログラムの出力である 2 つの画像です。唯一の違いは、それらが異なるマシンで実行されることです。アルゴリズムと制約が与えられた場合のプログラムの出力の違いを理解するのを手伝ってください。