在ImageTransformation[f,img]
中,函數f
使得得到的圖像中的點{x,y}
對應於img
中的f[{x,y}]
。由於得到的圖像基本上是img
的極座標變換,f
應該是反極性變換,所以你可以不喜歡
anamorphic[img_, angle_: 270 Degree] :=
Module[{dim = ImageDimensions[img], rInner = 1, rOuter},
rOuter = rInner (1 + angle dim[[2]]/dim[[1]]);
ImageTransformation[img,
Function[{pt}, {ArcTan[-#2, #1] & @@ pt, Norm[pt]}],
DataRange -> {{-angle/2, angle/2}, {rInner, rOuter}},
PlotRange -> {{-rOuter, rOuter}, {-rOuter, rOuter}},
Padding -> White
]
]
產生的圖像看起來像
anamorphic[ExampleData[{"TestImage", "Lena"}]]

請注意,您可以使用與ParametricPlot
和TextureCoordinateFunction
類似的結果,例如
anamorphic2[img_Image, angle_: 270 Degree] :=
Module[{rInner = 1,rOuter},
rOuter = rInner (1 + angle #2/#1 & @@ ImageDimensions[img]);
ParametricPlot[{r Sin[t], -r Cos[t]}, {t, -angle/2, angle/2},
{r, rInner, rOuter},
TextureCoordinateFunction -> ({#3, #4} &),
PlotStyle -> {Opacity[1], Texture[img]},
Mesh -> None, Axes -> False,
BoundaryStyle -> None,
Frame -> False
]
]
anamorphic2[ExampleData[{"TestImage", "Lena"}]]
編輯
在回答Mr.Wizard的問題,如果你沒有訪問ImageTransformation
或Texture
你可以通過執行類似
anamorph3[img_, angle_: 270 Degree, imgWidth_: 512] :=
Module[{data, f, matrix, dim, rOuter, rInner = 1.},
dim = ImageDimensions[img];
rOuter = rInner (1 + angle #2/#1 & @@ dim);
data = Table[
ListInterpolation[#[[All, All, i]],
{{rOuter, rInner}, {-angle/2, angle/2}}], {i, 3}] &@ImageData[img];
f[i_, j_] := If[Abs[j] <= angle/2 && rInner <= i <= rOuter,
Through[data[i, j]], {1., 1., 1.}];
[email protected][f[Sqrt[i^2 + j^2], ArcTan[i, -j]],
{i, -rOuter, rOuter, 2 rOuter/(imgWidth - 1)},
{j, -rOuter, rOuter, 2 rOuter/(imgWidth - 1)}]]
用手變換的圖像數據
請注意,這假定img
有三個通道。如果圖像具有更少或更多的通道,則需要修改代碼。
OP描述如何「(一)圖像反映在一個圓柱鏡」?我不是說這是錯的,只是我不明白。 –
@ heike - 很好的答案,非常感謝! – cormullion
@Mr巫術師 - 即使扭曲的變形圖像是(或者除Mathematica-ers外)無法識別的,您仍然會在中心粘貼一個圓柱鏡並且反射可以正確顯示圖像。 – cormullion