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

时间:2011-10-22 15:37:06

标签: wolfram-mathematica backwards-compatibility mathematica-8

我正在尝试使用Mathematica示例。这是Theo Gray's blog上的那个。

我认为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}]

2 个答案:

答案 0 :(得分: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}]]

mosaic

修改

原始代码在版本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附带的各种其他图像处理工具)。

答案 1 :(得分: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}]

enter image description here