我正在研究环的强度如何根据角度而变化。以下是图片的示例:
我想做的是从该甜甜圈的中心取一圈值并绘制它们与角度的关系。我目前正在做的是使用scipy.ndimage.interpolation.rotate并通过环径向切片,并提取两个峰的最大值并绘制这些峰与角度。
crop = np.ones((width,width)) #this is my image
slices = np.arange(0,width,1)
stack = np.zeros((2*width,len(slices)))
angles = np.linspace(0,2*np.pi,len(crop2))
for j in range(len(slices2)): # take slices
stack[:,j] = rotate(crop,slices[j],reshape=False)[:,width]
然而,我并不认为这是我正在寻找的。我主要是如何提取我想要的数据。我也试过应用一个看起来像这样的面具;
到图像,但后来我不知道如何以正确的顺序获取该掩码中的值(即按照增加角度0 - 2pi的顺序)
任何其他想法都会有很大的帮助!
答案 0 :(得分:3)
我制作了一个不同的输入图像来帮助验证正确性:
import numpy as np
import scipy as sp
import scipy.interpolate
import matplotlib.pyplot as plt
# Mock up an image.
W = 100
x = np.arange(W)
y = np.arange(W)
xx,yy = np.meshgrid(x,y)
image = xx//5*5 + yy//5*5
image = image / np.max(image) # scale into [0,1]
plt.imshow(image, interpolation='nearest', cmap='gray')
plt.show()
要从图像中的圆形路径中采样值,我们首先构建一个插值器,因为我们想要访问任意位置。我们也将它矢量化为更快
然后,我们使用圆N
的参数定义在圆周上生成x(t) = sin(t), y(t) = cos(t)
点的坐标。
N
应该至少是周长的两倍(奈奎斯特 - 香农采样定理)。
interp = sp.interpolate.interp2d(x, y, image)
vinterp = np.vectorize(interp)
for r in (15, 30, 45): # radii for circles around image's center
xcenter = len(x)/2
ycenter = len(y)/2
arclen = 2*np.pi*r
angle = np.linspace(0, 2*np.pi, arclen*2, endpoint=False)
value = vinterp(xcenter + r*np.sin(angle),
ycenter + r*np.cos(angle))
plt.plot(angle, value, label='r={}'.format(r))
plt.legend()
plt.show()