6

Tôi đang cố gắng để có được một ví dụ Mathematica làm việc. Đó là một trên Theo Gray's blog.Ảnh Mosaic trong Mathematica: một ví dụ từ năm 2008 không hoạt động trong Mathematica 8

Tôi nghĩ rằng Mathematica phải có thay đổi kể từ khi ông viết mã đó (tháng 5 năm 2008), vì tôi không thể có được bất cứ điều gì hợp lý, mặc dù thay đổi gần như mọi thứ. Tôi có sử dụng ImageData thay vì Nhập không? Bất cứ ai có thể đề xuất một phiên bản của mã này làm việc cho 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}] 

Trả lời

5

Các công trình sau đây (Nhờ @yoda để chỉ ra điều Reverse[] trong các ý kiến):

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

Người đàn ông, bán cầu nam đó ... luôn lật những thứ xung quanh – abcd

+0

@yoda Có lộn ngược không? Tôi không thể hiểu được bất cứ điều gì trong hình ảnh đó! –

+0

@yoda Nếu nó lộn ngược, hãy xóa bỏ 'Đảo ngược []' –

7

Có lẽ hơi hợp lý hơn:

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

Sửa

Lý do mà mã gốc ngừng làm việc trong phiên bản 8 là lên cho đến khi phiên bản 6 của Mathematica, Import["file.jpg"] sẽ trả về một đối tượng Graphics[Raster[]]. Để trích xuất dữ liệu hình ảnh, bạn chỉ cần thực hiện Import["file.jpg"][[1,1]]. Tuy nhiên, trong phiên bản 8 (và tôi nghi ngờ phiên bản 7) hình ảnh raster được nhập dưới dạng Image theo mặc định có nghĩa là bạn cần ImageData để trích xuất dữ liệu hình ảnh từ các tệp đã nhập. Bạn vẫn có thể nhập hình ảnh raster dưới dạng Graphics[Raster[]] bằng cách sử dụng Import["file.jpg","Graphics"] để mã ban đầu vẫn hoạt động nếu bạn điều chỉnh các tuyên bố Import, nhưng lợi thế của việc sử dụng các đối tượng Image là bạn có thể sử dụng các chức năng như ImageAssemble (cộng với một loạt các hình ảnh khác công cụ xử lý đi kèm với Mathematica 8).

+0

cảm ơn, có vẻ tốt – cormullion

+1

Câu trả lời hay. +1 –

Các vấn đề liên quan