Mathematica到Python/C代码

2024-04-26 03:11:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解Mathematica中的一些代码,但不熟悉它的语法。我好像不能把我的脑子绕到逻辑上来。在

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.}];
Image@Table[f[Sqrt[i^2 + j^2], ArcTan[i, -j]], 
{i, -rOuter, rOuter, 2 rOuter/(imgWidth - 1)},
{j, -rOuter, rOuter, 2 rOuter/(imgWidth - 1)}]]

关于这个代码的更多细节可以在这里找到

How to make ImageTransformation produce an anamorphic version of image。在

如果有人能为此编写伪代码/python代码,那就太好了。在


Tags: 代码imgdatatable语法逻辑allrouter
1条回答
网友
1楼 · 发布于 2024-04-26 03:11:50

我想结果会是这样的:

def anamorph3(img, angle = math.radians(270), imgWidth = 512):
    rInner = 1.
    dim = ImageDimensions(img)
    rOuter = rInner * (1 + angle * dim[2]/dim[1])
    data = list()
    for i in range(3):
        channelData = [[x[i] for x in v] for v in ImageData(img)]
        data.append(ListInterpolate(channelData, [[rOuter, rInner],[-angle/2,angle/2]]))
    def f(i, j):
        if abs(j) <= angle/2 && rInner <= i <= rOuter:
            l = list()
            for fun in data:
                l.append(fun(i, j))
            return l
        else:
            return [1, 1, 1]
    newImageData = list()
    for i in range(-rOuter, rOuter, 2*rOuter/(imgWidth-1)):
        l = list()
        for j in range(-rOuter, rOuter, 2*rOuter/(imgWidth-1)):
            l.append(f(math.sqrt(i**2 + j**2), math.atan(i, -j)))
        newImageData.append(l)
    return Image(newImageData) 

这里ImageDimensions返回图像的尺寸,ImageData返回一个三维矩阵,其中每个像素的每个颜色通道的颜色数据都标准化为0-1,并且ListInterpolate创建一个函数,在指定的x和y坐标范围内的一组数字之间进行插值。Image获取3D矩阵并将其转换为RGB图像。在

相关问题 更多 >