我一直在玩制作图像马赛克。我的脚本拍摄了大量图像,将它们缩小为缩略图大小,然后将它们用作平铺以逼近目标图像。
该方法实际上非常令人愉快:
我计算每个图块位置中每个拇指的均方误差。
起初,我只是使用贪婪的放置方式:将误差最小的拇指放在最适合的图块上,然后放置下一个,依此类推。
贪婪的问题在于,无论它们是否紧密匹配,最终都会让您最终将最不相同的指尖放在最不受欢迎的图块上。我在这里显示示例:http : //williamedwardscoder.tumblr.com/post/84505278488/making-image-mosaics
因此,我然后进行随机交换,直到脚本被中断。结果还可以。
随机交换两个图块并不总是一种改进,但是有时三个或更多图块的旋转会导致整体改进,即A <-> B
可能不会改进,但A -> B -> C -> A
1
可能会。
因此,在选择了两个随机图块并发现它们没有改善之后,我选择了一堆图块来评估它们是否可以成为这种旋转中的第三个图块。我不探讨是否可以使四个图块中的任何一组进行有利可图的旋转,等等。很快就会变得非常昂贵。
但这需要时间。。很多时间!
有没有更好,更快的方法?
赏金更新
我测试了匈牙利方法的各种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,右侧为随机交换)