图像颜色值之和

5 投票
1 回答
6405 浏览
提问于 2025-04-18 01:36

我想找个方法,把一张图片中所有像素的颜色值加起来。我需要这样做是为了估算一个明亮物体(比如远处的星系)从它的表面亮度图像发出的总光通量。有没有人能帮我,教我怎么把一张图片中所有像素的颜色值加起来呢?

举个例子:
下面这张图片中的每个像素的颜色值在0到1之间。但是当我用imread读取这张图片时,每个像素的颜色值会变成一个包含3个元素的数组。我对matplotlib还很陌生,不知道怎么把这个数组转换成0到1之间的单个值并把它们加起来。

在这里输入图片描述

1 个回答

7

如果你有一个PIL格式的图片,你可以这样把它转换成灰度图(也就是“亮度”):

from PIL import Image
col = Image.open('sample.jpg')
gry = col.convert('L') # returns grayscale version.

如果你想更好地控制颜色的添加方式,可以先把图片转换成numpy数组:

arr = np.asarray(col)
tot = arr.sum(-1)  # sum over color (last) axis
mn  = arr.mean(-1) # or a mean, to keep the same normalization (0-1)

或者你可以给颜色不同的权重,也就是让某些颜色更重要:

wts = [.25, .25, .5]    # in order: R, G, B
tot = (arr*wts).sum(-1) # now blue has twice the weight of red and green

对于大数组,这种方法和最后一行是一样的,而且速度更快,但可能不太容易理解:

tot = np.einsum('ijk, k -> ij', arr, wts)

以上所有方法都是在把每个像素的颜色加起来,把彩色图像变成灰度图(亮度图)。接下来这个方法会把所有的像素加在一起,计算整个图像的总和:

tot = arr.sum(0).sum(0) # first sums all the rows, second sums all the columns

如果你的图像是彩色的,tot会有三个值。如果你的图像是灰度的,它会只有一个值。如果你想要平均值,只需把sum换成mean就可以了:

mn = arr.mean(0).mean(0)

撰写回答