Фото Мозаика в Mathematica: пример 2008 года не работает в Mathematica 8 - PullRequest
6 голосов
/ 22 октября 2011

Я пытаюсь заставить пример Mathematica работать. Это тот самый блог Тео Грея .

Я думаю, что Mathematica, должно быть, изменился с тех пор, как он написал этот код (май 2008 г.), поскольку я не могу извлечь из этого ничего разумного, несмотря на то, что меняю почти все. Я использую ImageData вместо Импорта? Кто-нибудь может предложить версию этого кода, которая работает для 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 ]

7 голосов
/ 22 октября 2011

Может быть, немного более обтекаемым:

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, заключается в том, что вплоть до версии 6 Mathematica 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).

5 голосов
/ 22 октября 2011

Следующие работы (спасибо @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

...