将1D径向轮廓转换为2D图像

3

如何将一维向量f(r)转换为具有对称旋转的图像,我正在使用Python 2.7。

我想要的是一个带有左侧向量的右侧图像:

非常感谢。

2个回答

5
你可以构建一个以零为中心的距离矩阵,并将其作为参数传递给任何你想要的函数进行绘制:
import numpy as np
import matplotlib.pyplot as plt

def centeredDistanceMatrix(n):
    # make sure n is odd
    x,y = np.meshgrid(range(n),range(n))
    return np.sqrt((x-(n/2)+1)**2+(y-(n/2)+1)**2)

def function(d):
    return np.log(d) # or any function you might have

d = centeredDistanceMatrix(101)
f = function(d)
plt.plot(np.arange(51),function(np.arange(51)))
plt.show()
plt.imshow(f.T,origin='lower',interpolation='nearest')
plt.show()

这将导致:

数字日志

和:

2D数字日志

编辑:对于任意数据。

您可以使用interp1D将您的向量传递给函数,以便提供像素值。

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d

def centeredDistanceMatrix(n):
    # make sure n is odd
    x,y = np.meshgrid(range(n),range(n))
    return np.sqrt((x-(n/2)+1)**2+(y-(n/2)+1)**2)

def function(d):
    return np.log(d) # or any funciton you might have

def arbitraryfunction(d,y,n):
    x = np.arange(n) 
    f = interp1d(x, y)
    return f(d.flat).reshape(d.shape)

n = 101
d = centeredDistanceMatrix(n)
y = np.random.randint(0,100,n) # this can be your vector
f = arbitraryfunction(d,y,n)
plt.plot(np.arange(101),arbitraryfunction(np.arange(n),y,n))
plt.show()
plt.imshow(f.T,origin='lower',interpolation='nearest')
plt.show()

结果就是这样:

任意1D数据

和这个:

任意数据的革命


好的,但是如果我没有一个函数,只有一个具有任意轮廓的向量呢? - Nemesis
为了保护我的视力和减少科学家们的痛苦,请使用除jet以外的其他颜色映射,例如viridis(它是最新版本matplotlib的默认设置)!当然,这是一个非常棒的回答,点赞! - Ander Biguri

1
如果已知函数是关于'r'的,您可以使用以下程序。
from pylab import*
x=linspace(-10,10,200)
y=linspace(-10,10,200)
xx,yy=meshgrid(x,y)
z=sin((xx**2.0+yy**2.0)**0.5)
imshow(z)
show()

在这个程序中,我绘制了函数f(r)=sin(r)的二维旋转图形。
由于网格是以x-y坐标系表示的,而f是关于'r'的函数,因此我们必须改变坐标系(从极坐标系到笛卡尔坐标系)。
r= ((x**2 + y**2 ) **0.5)

所以 f(r) = sin(r) 变成了:
f(x,y)=sin( ((x**2 + y**2 ) **0.5) )

为了在同一帧中绘制这两个图形,它们可以作为子图添加到主框架中。

from pylab import*

fig = figure()
sub1 = fig.add_subplot(121)
sub2 = fig.add_subplot(122)

r=linspace(0,10,200)
fr=sin(r)
sub1.plot(r,fr)

x=linspace(-10,10,200)
y=linspace(-10,10,200)
xx,yy=meshgrid(x,y)
z=sin((xx**2.0+yy**2.0)**0.5)
sub2.imshow(z)

sub1.set_title('1D')
sub2.set_title('2D')

show()

子图的大小可以通过窗口底部的“配置子图”小部件手动调整。

示例输出

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接