转自Matrix67同学,原文地址:
上更新了一段非常牛的Mathematica代码,真的让我大开眼界。只需要三行代码,你就可以自己做一个马赛克拼图。 imagePool = Map[With[{i = Import[#]}, {i, Mean[Flatten[N[i[[1, 1]]], 1]]}] &, FileNames["Pool/*.jpg"]];
其中,“Pool/*.jpg”是你的图库,我估计最少也得有几百张吧。我用Photoshop把我的collection全部处理成了 35x35的小图;为了让最终效果更佳,我特地把它们全部处理成单色的,并且减小了对比度。"MasterImage.tif"是你的目标图 片,Mathematica会把这个图片中的每一个像素用图库中一个合适的图来代替。我把我的照片剪裁了一下,然后压成19x22的大小。 Mathematica首先把所有照片以及每个照片的RGB值的中位数存成一个list,函数closeMatch将图片按照RGB值的均方根排序,然后 随机从头20个中选出一个。第三行用Grid函数输出我们所要的马赛克拼图。{zh1}我们就得到了——由众MM图所组成的Matrix67的肖像画!!如果你 还看不出来的话,站远点儿眯着眼睛就能看出来了。closeMatch[c_] := RandomChoice[Take[SortBy[imagePool, Norm[c - #[[2]]] &], 20]][[1]]; Grid[Reverse[Map[closeMatch, Import["MasterImage.tif"][[1, 1]], {2}]], Spacings -> {0, 0}] Mathematica 5.0貌似没有SortBy和Grid等函数,因此这段代码在5.0下面不能用。为此我专门把Mathematica升到了6.0,改进不小,建议还在用 5.x的朋友都去试一试。起初在网上找Mathematica 6.0的下载找了半天,结果在北大数院的FTP里找到了,下载速度贼快。 找这玩意是因为借给我的HYDE_HYDE的booklet有一张豆子的马赛克拼图肖像,而说来惭愧我一直都不知道这种东西是怎么做出来的。如果你知道什么省事的做法告诉我吧。 |