6

Sto provando a far funzionare un esempio Mathematica. È quello su Theo Gray's blog.Photo Mosaic in Mathematica: un esempio del 2008 non funziona in Mathematica 8

Penso che Mathematica debba essere cambiata da quando ha scritto quel codice (maggio 2008), dal momento che non sono in grado di ricavarne nulla di ragionevole, nonostante abbia cambiato quasi tutto. Uso ImageData invece di Importa? Qualcuno può suggerire una versione di questo codice che funziona per 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}] 

risposta

5

I seguenti lavori (Grazie a @yoda per sottolineare la cosa Reverse[] nei commenti):

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

Uomo, quell'emisfero australe ... che capovolge sempre le cose intorno a – abcd

+0

@yoda È sottosopra? Non riesco a dare un senso a niente in quell'immagine! –

+0

@yoda Se è sottosopra, rimuovere 'Reverse []' –

7

Forse un po 'più snella:

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

Modifica

La ragione per cui il codice originale smesso di funzionare nella versione 8 è che fino versione 6 di Mathematica, Import["file.jpg"] restituirebbe un oggetto Graphics[Raster[]]. Per estrarre i dati dell'immagine si potrebbe semplicemente fare Import["file.jpg"][[1,1]]. Tuttavia, nella versione 8 (e sospetto la versione 7) le immagini raster vengono importate come Image per impostazione predefinita, il che significa che è necessario ImageData per estrarre i dati delle immagini dai file importati. È ancora possibile importare immagini raster come utilizzando il codice Import["file.jpg","Graphics"] in modo che il codice originale funzioni ancora se si adattano le istruzioni Import, ma il vantaggio dell'utilizzo degli oggetti Image è che è possibile utilizzare funzioni come ImageAssemble (più un'intera gamma di altre immagini strumenti di elaborazione forniti con Mathematica 8).

+0

grazie, sembra buono – cormullion

+1

Buona risposta. +1 –