6

我試圖獲得一個Mathematica例子。這是Theo Gray's blog上的那個。Mathematica中的照片馬賽克:2008年的一個例子在Mathematica中不起作用8

我認爲自從他編寫代碼(2008年5月)以來,Mathematica一定會發生變化,因爲我無法從中得到任何合理的東西,儘管幾乎所有東西都變了。我是否使用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}] 

回答

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[[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

男人,那南半球......總是在翻轉東西 – abcd

+0

@yoda它顛倒了嗎?我無法理解那張照片中的任何東西! –

+0

@yoda如果它是顛倒的刪除'Reverse []' –

7

也許稍微精簡:

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

編輯

,原來的代碼停在8版本工作的原因是,直到數學第6版,Import["file.jpg"]將返回Graphics[Raster[]]對象。要提取圖像數據本身,您可以簡單地執行Import["file.jpg"][[1,1]]。但是,在版本8(和我懷疑版本7)中,光柵圖像默認導入爲Image,這意味着您需要ImageData從導入的文件中提取圖像數據。您仍然可以通過使用Import["file.jpg","Graphics"]Graphics[Raster[]]作爲Graphics[Raster[]]導入,因此如果您修改Import語句,原始代碼仍然可以正常工作,但使用Image對象的優點是您可以使用諸如ImageAssemble之類的函數(加上其他圖像的整個範圍Mathematica 8附帶的處理工具)。

+0

謝謝,看起來不錯 – cormullion

+1

很好的答案。 +1 –