我正在尝试使用Mathematica示例。这是Theo Gray's blog上的那个。
我认为Mathematica自编写该代码以来一定发生了变化(2008年5月),因为尽管几乎改变了所有内容,但我无法从中得到任何合理的结果。我是否使用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}]
答案 0 :(得分:7)
可能稍微简化:
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中停止工作的原因是直到Mathematica版本6,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附带的各种其他图像处理工具)。
答案 1 :(得分: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[ImageData@i, 1]]}] &, f];
closeMatch[c_] :=
RandomChoice[Take[SortBy[imagePool, Norm[c - #[[2]]] &], 20]][[1]];
Grid[Map[closeMatch, ImageData@m, {2}], Spacings -> {0, 0}]