了解Pillow中的直方图()

时间:2014-03-17 17:00:14

标签: python histogram pillow

来自文档:

  

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 = 0
145像素,其值为R = 1, G = 0, B = 0
460像素,其值为R = 256, G = 1, B = 0
3953像素的值为R = 256, G = 256, B = 256等?

我应该如何读取输出?

3 个答案:

答案 0 :(得分:9)

我还没有通过测试,但是从文档中可以看出,直方图似乎表明直方图仅适用于每个频道(例如红色,绿色,蓝色)单独

  

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

所以,不,你给出的例子并不是真的。 768值仅为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

答案 1 :(得分:3)

不,你不知道有多少像素(例如)R = 0,G = 0,B = 0。 这需要一个类似1600万条目的直方图。

你只知道有多少人有R = 0,有多少人有G = 0,有多少人有B = 0,他们是独立的。

R = 0像素完全有可能有很多不同数量的G和B.

答案 2 :(得分:0)

如果模式是RGB打开图像,则768表示红色灰色列表[0-255像素数字] +绿色灰色列表[0-255像素数字] +蓝色灰色列表[0-255 pix numbs]

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