4

从文档:

im.histogram() => 列表

返回图像的直方图。直方图以像素计数列表的形式返回,源图像中的每个像素值对应一个。如果图像有多个波段,则连接所有波段的直方图(例如,“RGB”图像的直方图包含 768 个值)。

我知道红色有 256 个值,绿色有 256 个值,蓝色有 256 个值(256 * 3 = 768)。

for i, value in enumerate(im.histogram()):
    print i, value

产生:

0 329
1 145
... (skipping some)
256 460
... (skipping some)
767 3953

我的问题是:这是否意味着有:
329 个像素的值为R = 0, G = 0, B = 0145
个像素的值为R = 1, G = 0, B = 0460
个像素的值为 3953 个像素的值为R = 256, G = 1, B = 0等?
R = 256, G = 256, B = 256

那是我应该如何阅读输出吗?

4

3 回答 3

10

我还没有测试过,但从文档来看,措辞似乎表明直方图仅适用于每个通道(例如红色、绿色、蓝色)单独

如果图像有多个波段,则 连接所有波段的直方图(例如,“RGB”图像的直方图包含 768 个值)。

所以,不,你给出的例子并不正确。768values 是 just 256 * 3,它是可能的红色值的数量,加上可能的绿色值的数量,加上独立的可能的蓝色值的数量。它并不代表红色、绿色和蓝色的所有可能组合,而是256 ^ 3 == 16777216.

据我所知,您的示例直方图值的解释应该是:

329  pixels with value of R = 0, G = ?, B = ? and
145  pixels with value of R = 1, G = ?, B = ? and
...
460  pixels with value of R = ?, G = 1, B = ? and
...
3953 pixels with value of R = ?, G = ?, B = 256
于 2014-03-17T17:15:21.810 回答
3

不,您不知道有多少像素(例如)R=0、G=0、B=0。这将需要一个包含大约 1600 万个条目的直方图。

你只知道有多少个 R=0,有多少个 G=0,有多少个 B=0,独立进行。

R=0 像素完全有可能拥有大量不同数量的 G 和 B。

于 2014-03-17T17:17:09.120 回答
0

如果模式是RGB打开图像,768的意思是红色灰色列表[0-255 pix nums]+绿色灰色列表[0-255 pix nums]+蓝色灰色列表[0-255 pix nums]

im 是 RGB 的 Image 对象

在 [59] 中:x = reduce(lambda x,y:x+y,im.histogram())

输入 [60]:x 输出 [60]:47191725

输入 [61]: im.size 输出[61]: (4731, 3325)

输入[62]:4731*3325 输出[62]:15730575

输入[63]:4731*3325*3 输出[63]:47191725

在[64]中:

或其他方式:

r, g, b = im.split()

len(r.histogram()) = 256

len(g.histogram()) = 256

len(b.histogram()) = 256

于 2016-01-11T13:16:53.867 回答