6

我正在尝试使 Mathematica 示例正常工作。这是Theo Gray 博客上的那个。

我认为自从他编写该代码(2008 年 5 月)以来,Mathematica 一定发生了变化,因为尽管几乎所有内容都发生了变化,但我无法从中得到任何合理的结果。我是否使用 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}]
4

2 回答 2

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}]]

马赛克

编辑

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

于 2011-10-22T16:44:42.093 回答
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}]

在此处输入图像描述

于 2011-10-22T16:15:05.120 回答