图像的色值之和

use*_*692 5 python numpy matplotlib

我正在寻找一种方法来对图像的所有像素的颜色值求和.我要求它从其表面亮度图像估计一个明亮光源(比如一个遥远的星系)的总光通量.有谁请帮助我如何总结图像的所有像素的颜色值.

例如:下一个图像的每个像素的颜色值介于0到1之间.但是当我用imread读取图像时,我得到的每个像素的颜色值是一个包含3个元素的数组.我是matplotlib中的新手,我不知道如何将该数组转换为0到1的单个值并添加它们.

在此输入图像描述

ask*_*han 7

如果您有PIL图像,那么您可以转换为灰度("发光度"),如下所示:

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

如果您想要更多地控制颜色的添加方式,请先转换为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)
Run Code Online (Sandbox Code Playgroud)

或者你可以不同地加权颜色:

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

对于大型数组,这相当于最后一行并且更快,但可能更难阅读:

tot = np.einsum('ijk, k -> ij', arr, wts)
Run Code Online (Sandbox Code Playgroud)

所有上述相加的颜色的各像素的,把彩色图像转换成灰度级(亮度)的图像.以下将所有像素加在一起以查看整个图像的积分:

tot = arr.sum(0).sum(0) # first sums all the rows, second sums all the columns
Run Code Online (Sandbox Code Playgroud)

如果您有彩色图像,tot仍会有三个值.如果您的图像是灰度图像,则它将是单个值.如果你想要平均值,只需替换summean:

mn = arr.mean(0).mean(0)
Run Code Online (Sandbox Code Playgroud)