由内而外的图像变换

cor*_*ion 8 wolfram-mathematica image-processing

在探索了Heike对我之前关于变形变换的问题的非常好的答案之后,我最终想要看到一个完全由里面翻转的图像.

我们的想法是,不仅仅是通过变形变换来拉伸图像,就像你拉动纸张的边缘一样,你实际上可以将纸张"从里面拉出来".内部"像素"将被拉出到边缘(极度扭曲/拉伸),而外部像素将向内朝向中心压扁(大大缩小).

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

从里到外的图像变换

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

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

findgeometrictransform

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

你怎么看?可能吗?

编辑

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

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

内向的蒙娜丽莎

这是布拉格的Orloj:

里里外外的时钟

对此的实际用途即将到来,呃,很快......

谢谢!

Dr.*_*ius 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]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑

使用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]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑

设置:

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

在此输入图像描述

  • 如果你想要一对一的映射,你可以使用f [x_,y _]:= {x,y}(1/Norm [{x,y},Infinity] - 1)进行转换函数 (4认同)