【问题标题】:Calculating average pixel RGB values in an ellipse计算椭圆中的平均像素 RGB 值
【发布时间】:2016-01-28 16:51:02
【问题描述】:

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

【问题讨论】:

标签: python matplotlib ellipse


【解决方案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() 以了解其扩展方式。您还可以通过将XXYY 乘以rotation matrix 来获得旋转椭圆(确保在应用转换之前减去ctr - 否则您会得到疯狂的结果)。

我没有经常使用imread,但看起来它产生了一个 M x N x 3 数组。所以要算出距离rctr之间所有像素的平均R值,你计算np.mean(im[:, :, 0][d < r])

【讨论】:

    猜你喜欢
    • 2020-12-26
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    相关资源
    最近更新 更多