来自文档:
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
等?
我应该如何读取输出?
答案 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