【问题标题】:Sum of colorvalues of an image图像颜色值的总和
【发布时间】:2014-04-07 08:19:37
【问题描述】:

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

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

【问题讨论】:

    标签: python numpy matplotlib


    【解决方案1】:

    如果您有 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)
    

    【讨论】:

    • 感谢 askewchan 的回复。我想,我无法正确解释我的需求。我为此感到抱歉。我实际上想以 0-1 的比例估计图像每个像素的颜色。此时,在使用 imread 读取图像后,我使用数组获取每个像素的值。说,我读了,d = imread('i.png')。然后我得到 d[0,0]=array([ 0.27843139, 0.27843139, 0.85882354], dtype=float32)。但我想要颜色条刻度上的值,比如 d[0,0] = 0.4。然后我想添加 d[i, j] 的值(i,j 分别从 0 运行到 nrows 和 ncols),我的意思是所有像素。
    • 您有一张彩色图像:当您查看一个像素 (d[0,0]) 时看到的三个值是红色、绿色和蓝色通道的值。如果您想为每个像素设置一个值,您必须以某种方式将三个颜色通道相加或平均以形成一个通道(灰度/亮度)。我已经向您展示了一些方法来做到这一点。加权 (wts) 版本可让您最大程度地控制颜色的添加/平均方式。我在答案的末尾添加了一个部分,向您展示如何在制作图像灰度(单通道)后将所有 像素 相加。
    • 您的图像似乎仍然是彩色的。你是如何转换成灰度的?你保存结果了吗?你不能只做im.convert('L'),你必须做im = im.convert('L'),或者把它保存到另一个名字,比如gray = im.convert('L')
    • 对不起!你说的对。图像之前没有转换为灰度。现在我明白了,我想。请检查我的做法。 im=Image.open('i.png'), arr=np.asarray(im), tot=arr.sum(-1), F1 = tot.sum(0).sum(0)。我得到另一个来源的 F2。然后我做 F1/F2。请让我知道我这样做是否正确。
    • 由于您要添加所有颜色,然后添加所有像素,您只需执行tot = arr.sum(),它就会立即添加_all_axes。否则,我觉得不错!
    猜你喜欢
    • 2019-06-22
    • 1970-01-01
    • 2013-03-15
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多