我正在用 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 个单独的对象列表:一个 for tiles
,另一个 for cells
。
问题是平均大约有 300 个图块和多达 50,000 个单元格(也可能更多!)。因此,当我的程序运行时,除了它执行的计算和其他 ip/op 操作之外,它在内存中有这么多对象。
当我在资源较少(可用内存较少)的机器上运行此程序时,创建的输出图像会失真。但是当我在具有更多可用资源的机器上运行它时,它就完美了。我认为这是因为当没有可用资源时,它无法一次将所有对象保存在内存中。所以我看到一张图片放错了瓷砖。但是当它有足够的内存时,我会看到完美的输出图像。
我可以做些什么来确保无论可用内存如何,我都可以保留添加的元素的顺序,outputList
以便我可以看到没有失真的图像。
谢谢。
编辑:
下面是同一个程序的输出的 2 个图像。唯一的区别是它们在不同的机器上运行。请帮助我理解给定算法和约束的程序输出的差异。