6

Estoy intentando que funcione un ejemplo de Mathematica. Es el de Theo Gray's blog.Mosaico de fotos en Mathematica: un ejemplo de 2008 no funciona en Mathematica 8

Creo que Mathematica debe haber cambiado desde que escribió ese código (mayo de 2008), ya que no puedo obtener nada razonable de él, a pesar de cambiar casi todo. ¿Uso ImageData en lugar de Importar? ¿Alguien puede sugerir una versión de este código que funcione para 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}] 

Respuesta

5

Las siguientes obras (Gracias a @yoda por señalar lo Reverse[] en los comentarios):

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

enter image description here

+1

Hombre, ese hemisferio sur ... siempre cambiando las cosas – abcd

+0

@yoda ¿Está al revés? ¡No puedo encontrarle sentido a nada en esa imagen! –

+0

@yoda Si está al revés, elimine 'Reverse []' –

7

Tal vez un poco más ágil:

imagePool = Map[With[{i = Import[#]}, {i, [email protected][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

Editar

La razón de que el código original dejó de funcionar en la versión 8 es que hasta la versión 6 de Mathematica, Import["file.jpg"] podría devolver un objeto Graphics[Raster[]]. Para extraer los datos de la imagen en sí, simplemente puede hacer Import["file.jpg"][[1,1]]. Sin embargo, en la versión 8 (y sospecho que la versión 7), las imágenes ráster se importan como Image de forma predeterminada, lo que significa que necesita ImageData para extraer los datos de imagen de los archivos importados. Puede seguir importando imágenes ráster como Graphics[Raster[]] usando Import["file.jpg","Graphics"] para que el código original siga funcionando si adapta las declaraciones Import, pero la ventaja de usar objetos Image es que puede usar funciones como ImageAssemble (más un rango completo de otra imagen) herramientas de procesamiento que viene con Mathematica 8).

+0

gracias, se ve bien – cormullion

+1

Buena respuesta. +1 –