制作图像镶嵌的算法-有比这更快的方法吗?


9

我一直在玩制作图像马赛克。我的脚本拍摄了大量图像,将它们缩小为缩略图大小,然后将它们用作平铺以逼近目标图像。

该方法实际上非常令人愉快:

我计算每个图块位置中每个拇指的均方误差。

起初,我只是使用贪婪的放置方式:将误差最小的拇指放在最适合的图块上,然后放置下一个,依此类推。

贪婪的问题在于,无论它们是否紧密匹配,最终都会让您最终将最不相同的指尖放在最不受欢迎的图块上。我在这里显示示例:http : //williamedwardscoder.tumblr.com/post/84505278488/making-image-mosaics

因此,我然后进行随机交换,直到脚本被中断。结果还可以。

随机交换两个图块并不总是一种改进,但是有时三个或更多图块的旋转会导致整体改进,即A <-> B可能不会改进,但A -> B -> C -> A1可能会。

因此,在选择了两个随机图块并发现它们没有改善之后,我选择了一堆图块来评估它们是否可以成为这种旋转中的第三个图块。我不探讨是否可以使四个图块中的任何一组进行有利可图的旋转,等等。很快就会变得非常昂贵。

但这需要时间。。很多时间!

有没有更好,更快的方法?


赏金更新

我测试了匈牙利方法的各种Python实现和绑定。

到目前为止最快的是纯Python https://github.com/xtof-durr/makeSimple/blob/master/Munkres/kuhnMunkres.py

我的直觉是,这近似于最佳答案。当在测试映像上运行时,所有其他库都对结果达成了共识,但是这个kuhnMunkres.py虽然快了几个数量级,但是却非常非常接近其他实现所同意的分数。

速度与数据密切相关;蒙娜丽莎(Mona Lisa)在13分钟内冲过kuhnMunkres.py,但猩红胸鹦鹉(Scarlet Chested Parakeet)花了16分钟。

结果与长尾小鹦鹉的随机互换和轮换非常相似:

在此处输入图片说明在此处输入图片说明

(左侧为kuhnMunkres.py,右侧为随机交换;用于比较的原始图像

但是,对于我测试过的《蒙娜丽莎》图像,结果得到了明显改善,实际上,她定义的“微笑”闪闪发光:

在此处输入图片说明在此处输入图片说明

(左侧为kuhnMunkres.py,右侧为随机交换)


1
相关... ish。在Codegolf上,味transform变换也有类似问题。

1
另一个相关的图像集是allRGB,其中每个图像(尽管并不能给您太多提示的方法 ……只是在另一个区域已解决此问题)。

1
几年前,我在马赛克制造商那里遇到了这个问题。我当时和现在的推理是,问题不仅仅在于算法(MSE部分),而在于输入图像调色板的大小受限。由于没有十亿张图片可供使用,我通过在一段时间后重新使用图片来伪造它。但是,如果您希望采用这种方法,最好先进行一次“良好”拟合,然后将其余图像作为随机图像(或随机图像)进行处理-仅使用有限的输入集这么多的选择。
J Trana

@MichaelT感谢您的出色链接:)特别是codegolf令人着迷。我发现投票最好的解决方案是使用随机交换(不是随机轮换),并且大概运行了一段时间……
2014年

1
选择答案并授予赏金后,请注意此问题。另一种方法是将其视为模拟退火问题。您可以将SA用作解决方案流程的阶段之一。
andy256'9

Answers:


3

是的,有两种更好更快的方法。

  • 比较简单的问题:为每个图块选择最佳的缩略图(可能重复)。好的,那是作弊,但只能带来更好的视觉效果。
  • 假设您将MSE作为匹配费用,其总和必须最小,那么您的收入在算法上会更有趣,并且归结为“线性分配问题”。这种问题可以在多项式时间内通过“匈牙利方法”解决

然后,您可以通过以更直观的距离替换MSE来调整成本,而无需更改基础算法。


谢谢!LAP和匈牙利方法是我需要的线索!更新有问题的结果。
2014年

3

我有理由确定这是一个NP难题。要找到一个“完美”的解决方案,您必须详尽地尝试每种可能性,这是指数级的。

一种方法是使用贪婪拟合,然后尝试对其进行改进。这可能是通过拍摄放置不良的图像(最后一个图像)并找到放置它的另一个位置,然后拍摄该图像并移动它,依此类推。当您(a)时间用完(b)拟合度“足够好”时,您就完成了。

如果引入概率元素,则可能会产生模拟退火方法或遗传算法。也许您要实现的所有目标就是平均分布错误。我怀疑这已经接近您已经在做的事情了,答案是:使用正确的算法,您可能会更快地获得更好的结果,但是没有通往涅磐的神奇捷径。


是的,这类似于您已经在做的事情。关键是要忘记一个神奇的答案,并根据2种算法进行思考:首先填充,然后优化。

填充可以是:随机,最佳可用,最佳,足够好,某种热点。

优化可以是随机的,可以解决最坏的情况,也可以(如我建议的那样)模拟退火或遗传算法。

您需要一个“好”指标,以及准备花费在它上面并进行试验的时间。或找到实际做到的人。


您准确地描述了问题中描述的方法...?
2014年

1

如果最后一块是您的问题,则应尝试以某种方式尽早放置它们;)

一种方法是查看距离其匹配的最高x%最远的图块(直觉上我会选择33%),并将其放在其最佳匹配上。无论如何,这是最好的搭配。

此外,您可以选择不针对最差的图块使用最佳匹配,而是针对与该广告位的最佳匹配相比引入误差最小的那个,这样就不会为了“损害控制”。

需要注意的另一件事是,最终您将生成要用眼睛处理的图像。因此,您真正想要的是使用一些边缘检测来确定图像上哪些位置最重要。同样,在图像的最外围发生的情况对效果的质量影响很小。叠加这两个权重并将其包括在距离计算中。因此,您得到的任何抖动都应该引向边界并远离边缘,从而减少了很多干扰。

同样,在边缘检测到位的情况下,您可能希望贪婪地放置第一个y%(也许直到您降至左侧图块中的“边缘度”的某个阈值以下),这样才能很好地处理“热点”,然后其余部分切换到“损坏控制”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.