由内而外的图像变换

时间:2011-11-25 14:25:04

标签: image-processing wolfram-mathematica

在探索了Heike对我previous question about anamorphic transformations的非常好的答案之后,我最终想看到一张完全由内而外的图像。

这个想法是,不仅仅是用变形变换拉伸图像,就像你拉着纸张的边缘一样,你实际上可以将纸张“从内到外”。内部“像素”将被拉出边缘(极度扭曲/拉伸),而外部像素将向内朝中心压扁(大幅缩小)。

我无法说明,但另一种尝试描述它的方法是在这张图片中:

inside out image transform

因此,像素越红,它们转换到边缘的次数就越多(反之亦然)。

我尝试过FindGeometricTransform,但它似乎没有任何优势。

findgeometrictransform

这对谷歌来说并不容易,而且我还没有在Mathematica中找到任何可能发生这种破坏性转变的线索。这是一种2.5D的重新投影。

你怎么看?有可能吗?

修改

所以,由于你的答案很好,我现在可以恰当地说明我的问题:

这是莱昂纳多着名的Anom Asil,这是让可怜的Lisa受到内向外变换​​的结果():

introverted mona lisa

这是布拉格Orloj:

inside out clock

即将到来,呃,实际用途......

谢谢!

2 个答案:

答案 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]

enter image description here

修改

使用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]

enter image description here

修改

环境:

f[x_, y_, t_] := {x, y} ((1/Norm[{x, y}, Infinity] - 1 ) t + (1 - t));

enter image description here

答案 1 :(得分:3)

如果原生变换函数不能在一次传递中容纳这个,你可以通过将图像转换为极坐标,然后反转半径数据来获得所需的结果。希望Heike很快就会帮你解决问题。 ; - )


反对我更好的判断,这是我粗略和讨厌的代码作为一个例子。零过采样,构思不佳,魔术数字,通常无用。但是,belisarius要求它,它就在这里!

img =此图片开始:

enter image description here

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}]

产生这种像素化的暴行:

enter image description here