Mathematica中的Photo Mosaic:2008年的一个例子在Mathematica 8中不起作用

cor*_*ion 6 wolfram-mathematica backwards-compatibility mathematica-8

我正在尝试使用Mathematica示例.这是Theo Gray博客上的那个.

我认为Mathematica自编写该代码以来一定发生了变化(2008年5月),因为尽管几乎改变了一切,但我无法从中得到任何合理的结果.我是否使用ImageData而不是Import?任何人都可以建议这个代码的版本适用于Mathematica 8?

imagePool = 
 Map[With[{i = Import[#]}, {i, Mean[Flatten[N[i[[1, 1]]], 1]]}] &, 
  FileNames["Pool/*.jpg"]];
closeMatch[c_] := 
  RandomChoice[Take[SortBy[imagePool, Norm[c - #[[2]]] &], 20]][[1]];
Grid[Reverse[
  Map[closeMatch, Import["MendeleevIcon.tif"][[1, 1]], {2}]], 
  Spacings -> {0, 0}]
Run Code Online (Sandbox Code Playgroud)

Hei*_*ike 7

也许稍微简化:

imagePool = Map[With[{i = Import[#]}, {i, N@Mean[Flatten[ImageData[i], 1]]}] &, 
   FileNames["Pool/*.jpg"]];

closeMatch[c_] := RandomChoice[
   Nearest[imagePool[[All, 2]] -> imagePool[[All, 1]], c, 20]]

ImageAssemble[Map[closeMatch, ImageData[Import["mendeleevIcon.tif"]], {2}]]
Run Code Online (Sandbox Code Playgroud)

镶嵌

编辑

原始代码在版本8中停止工作的原因是,直到Mathematica版本6,Import["file.jpg"]才会返回一个Graphics[Raster[]]对象.要提取图像数据本身就可以了Import["file.jpg"][[1,1]].但是,在版本8(我怀疑版本7)中Image,默认情况下导入光栅图像,这意味着您需要ImageData从导入的文件中提取图像数据.您仍然可以Graphics[Raster[]]通过使用导入光栅图像,Import["file.jpg","Graphics"]因此如果您调整Import语句,原始代码仍然可以工作,但使用Image对象的优点是您可以使用诸如此类的功能ImageAssemble(以及随附的一系列其他图像处理工具) Mathematica 8).


Dr.*_*ius 5

以下作品(感谢@yoda指出Reverse[]评论中的内容):

f = FileNames["*.jpg", {"c:\\test\\pool\\Pool"}];
m = Import["c:\\test\\pool\\Pool\\MendeleevIcon.tif"];
imagePool =
  Map[
   With[{i = Import[#]},
     {i, Mean[Flatten[ImageData@i, 1]]}] &, f];
closeMatch[c_] := 
  RandomChoice[Take[SortBy[imagePool, Norm[c - #[[2]]] &], 20]][[1]];
Grid[Map[closeMatch, ImageData@m, {2}], Spacings -> {0, 0}]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述