计算椭圆中的平均像素 RGB 值

Calculating average pixel RGB values in an ellipse

我有一张星系的黑白图像,我需要像这样测量每个同心椭圆的平均像素 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 值。我这个假设错了吗?

是的,这绝对是可能的。如果您知道坐标系的起点和终点以及像素比例(在每个轴上),那么您可以构建几个坐标矩阵,有点像这样:

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.) 计算每个像素与该中心的距离。这是欧几里德距离度量,并使用毕达哥拉斯定理。 (您还可以使用广播规则和带有 axis 参数的 sum() 来使它更紧凑一些,但对于初学者来说,我使用的语法更具可读性。)

如果要制作轴比不等于1的椭圆,只需将上述距离度量公式中的一项乘以一个常数即可。使用 plt.contour() on the resulting matrix to get a feel for how that scales. You can also get rotated ellipses by multiplying XX and YY by a rotation matrix(确保在应用转换之前减去 ctr——否则你会得到奇怪的结果)。

我没怎么用过 imread,但看起来它生成了一个 M x N x 3 数组。因此,要计算距离 ctr 距离 r 内所有像素的平均 R 值,您可以计算 np.mean(im[:, :, 0][d < r])