我有一个B& W星系图像,我需要测量每个同心椭圆的平均像素RGB值,如下所示:
到目前为止的代码是
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
from matplotlib import pyplot, lines
import matplotlib.image as mpimg
import numpy as np
from scipy.misc import imread
from matplotlib.patches import Ellipse
dpi=80
im_data = imread('test.png')
height, width, nbands = im_data.shape
print height, width
figsize = width / float(dpi), height / float(dpi)
print figsize
fig = plt.figure(figsize=figsize)
ax = fig.add_axes([0, 0, 1, 1])
ax.axis('off')
ax.imshow(im_data, interpolation='nearest')
for i in range(10,400,10):
ell = Ellipse(xy=[240,268], width=i, height=i*0.9, angle=70, edgecolor='b',lw=4, alpha=0.3,facecolor='none')
ax.add_artist(ell)
plt.show()
所以我的问题是:
1)是否有一种简单的方法来提取每个点的坐标(到不确定的逻辑程度,至少20个点)?
2)下一步似乎更容易,因为我们可以使用pix=im.load()
和pix [x,y]来获取RGB值。这个假设我错了吗?
答案 0 :(得分:1)
是的,这绝对是可能的。如果您知道坐标系的开始和结束位置以及像素比例(在每个轴上),那么您可以构造几个坐标矩阵,如下所示:
x = np.linspace(xll, xul, im.shape[1])
y = np.linspace(yll, yul, im.shape[0])
XX, YY = np.meshgrid(x, y)
np.meshgrid()
是我作为光学天文学家的主要功能之一 - 绝对熟悉它。
现在让我们说你的中心像素的世界坐标(不要与你的像素坐标混淆)是ctr
。您可以使用公式d = np.sqrt((ctr[0] - XX)**2 + (ctr[1] - YY)**2.)
计算每个像素与该中心的距离。这是欧几里德距离度量,并使用毕达哥拉斯定理。 (您也可以使用广播规则和sum()
和axis
参数来使其更紧凑,但对于初学者,我使用的语法更具可读性。)
如果要制作轴比不等于1的椭圆,则只需将上述距离度量公式中的一个项乘以常数即可。在结果矩阵上使用plt.contour()
可以了解缩放的方式。您还可以通过将XX
和YY
乘以rotation matrix来获得旋转的椭圆(确保在应用转换之前减去ctr
- 否则您将会这样做得到狂野的结果)。
我还没有使用imread
,但看起来它产生了一个M x N x 3阵列。因此,要计算r
距离ctr
内所有像素的平均R值,您需要计算np.mean(im[:, :, 0][d < r])