Photo Mosaic в Mathematica: пример из 2008 года не работает в Mathematica 8

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

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

person cormullion    schedule 22.10.2011    source источник


Ответы (2)


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

введите здесь описание изображения

person Dr. belisarius    schedule 22.10.2011
comment
Чувак, это южное полушарие... всегда все переворачивает - person abcd; 22.10.2011
comment
@yoda Это вверх ногами? Я ничего не могу понять на этом изображении! - person Dr. belisarius; 22.10.2011
comment
@yoda Если он перевернут, удалите Reverse[] - person Dr. belisarius; 22.10.2011
comment
Да, он вверх ногами. Два темных пятна по обе стороны от полосы Fm-Es-Fm---Es` в середине нижней трети – это глаза. Начиная с этого, если вы проследите за более темными изображениями, идущими вверх от левого глаза (рисунок слева), они образуют тень носа и в конечном итоге расходятся в верхней трети, чтобы стать усами. - person abcd; 22.10.2011
comment
Я видел Reverse... Теперь это менее смешно, потому что я сначала подумал, что ты сделал это нарочно :) - person abcd; 22.10.2011
comment
Изменилось ли что-то между версиями или это проблема пути? - person Mr.Wizard; 22.10.2011
comment
@Mr.Wizard: Я думаю, что изменилось то, что в Mathematica 8 (и, возможно, 7) Import["file.jpg"] возвращает Image[], тогда как в более старых версиях он возвращал Graphics[Raster[]]. Вы по-прежнему можете импортировать файл как Graphics[Raster[]] с помощью `Import[file.jpg,Graphics] - person Heike; 22.10.2011
comment
@Heike, ИМХО, это должно быть указано в ответе. - person Mr.Wizard; 22.10.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}]]

мозаика

Изменить

Причина, по которой исходный код перестал работать в версии 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).

person Heike    schedule 22.10.2011