图像颜色值之和
我想找个方法,把一张图片中所有像素的颜色值加起来。我需要这样做是为了估算一个明亮物体(比如远处的星系)从它的表面亮度图像发出的总光通量。有没有人能帮我,教我怎么把一张图片中所有像素的颜色值加起来呢?
举个例子:
下面这张图片中的每个像素的颜色值在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)