在探索了Heike对我previous question about anamorphic transformations的非常好的答案之后,我最终想看到一张完全由内而外的图像。
这个想法是,不仅仅是用变形变换拉伸图像,就像你拉着纸张的边缘一样,你实际上可以将纸张“从内到外”。内部“像素”将被拉出边缘(极度扭曲/拉伸),而外部像素将向内朝中心压扁(大幅缩小)。
我无法说明,但另一种尝试描述它的方法是在这张图片中:
因此,像素越红,它们转换到边缘的次数就越多(反之亦然)。
我尝试过FindGeometricTransform,但它似乎没有任何优势。
这对谷歌来说并不容易,而且我还没有在Mathematica中找到任何可能发生这种破坏性转变的线索。这是一种2.5D的重新投影。
你怎么看?有可能吗?修改的
所以,由于你的答案很好,我现在可以恰当地说明我的问题:
这是莱昂纳多着名的Anom Asil,这是让可怜的Lisa受到内向外变换的结果():
这是布拉格Orloj:
即将到来,呃,实际用途......
谢谢!
答案 0 :(得分:10)
也许是这样的:
f[x_, y_] := {x, y} (1/Norm@{x, y} - 1);
GraphicsGrid[{{
p = Rasterize[Graphics[ {Black, Disk[{0, 0}, 5],
Red, Disk[{0, 0}, 3],
Blue, Disk[{0, 0}, 2]}]],
ImageTransformation[p, f[#[[1]], #[[2]]] &,
DataRange -> {{-1, 1}, {-1, 1}}]}},
Frame -> All]
修改强>
使用Heike的f
函数是双射的,它是自己的逆函数:
f[x_, y_] := {x, y} (1/Norm[{x, y}, Infinity] - 1);
g[x_]:=ImageTransformation[x, f[#[[1]], #[[2]]] &,DataRange ->{{-1, 1}, {-1, 1}}]
GraphicsGrid[{{i, g@i, g@g@i}}, Frame -> All]
修改强>
环境:
f[x_, y_, t_] := {x, y} ((1/Norm[{x, y}, Infinity] - 1 ) t + (1 - t));
答案 1 :(得分:3)
如果原生变换函数不能在一次传递中容纳这个,你可以通过将图像转换为极坐标,然后反转半径数据来获得所需的结果。希望Heike很快就会帮你解决问题。 ; - )
反对我更好的判断,这是我粗略和讨厌的代码作为一个例子。零过采样,构思不佳,魔术数字,通常无用。但是,belisarius要求它,它就在这里!
从img =
此图片开始:
dat = ImageData[img];
atan2[0., 0.] := 0
atan2[a_, b_] := ArcTan[a, b]
coords = Array[
Round@{# Cos[#2], # Sin[#2]} + 144 &[(144 - Norm[{#, #2}]),
atan2[#2, #]] &[N@#, N@#2] &, {289, 289}, -144];
Image@Apply[dat[[##]] &, coords, {2}]
产生这种像素化的暴行: