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

时间:2016-04-08 13:56:25

标签: python image python-2.7

如何将1D矢量f(r)转换为具有对称旋转的图像。我正在使用python 2.7。

我想用一个数字做什么。我希望图像在右边,左边有一个矢量:

非常感谢。

2 个答案:

答案 0 :(得分:4)

你可以在它的中心建立一个零点的距离矩阵,并将其作为你想要的任何函数的参数:

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()

,结果是:

Log of numbers

,并且:

2D log of numbers

任意数据

编辑

您可以使用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()

,结果如下:

arbitrary 1D data

,这个:

revolution of arbitrary data

答案 1 :(得分: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)的2D旋转。

由于meshgrid在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()

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

Sample output

enter image description here