如何获取图像的二维直方图?

时间:2018-03-01 05:18:53

标签: python numpy opencv scipy

更具体地说,这是确切的要求。我不确定如何说出这个问题。 我有一张大小为(500,500)的图片。我只提取r和g通道

r = image[:, :, 0]
g = image[:, :, 1]

然后,我计算r和g的二维直方图

hist2d = np.histogram2d(r, g, bins=256, range=[(255,255),(255,255)])

现在,hist2d[0].shape(256, 256),因为它对应于每对256x256颜色。细

主要要求是,在单独的图像中,称为result,其形状与原始图像相同,即(500, 500),我想用{2}直方图的值填充result的每个元素rg频道

例如,如果r[200,200]为23且g[200, 200]为26,我想放置result[200, 200] = hist2d[0][23, 26]

这样做的天真方法是简单的python循环。

for i in range(r.shape[0]):
    for j in range(r.shape[1]):
        result[i, j] = hist2d[0][r[i, j], g[i, j]]

但是对于大图像,这需要很长的时间来计算。有这么一种笨拙的方式吗?

由于

1 个答案:

答案 0 :(得分:3)

只需使用hist2d[0][r, g]

import numpy as np

r, g, b = np.random.randint(0, 256, size=(3, 500, 500)).astype(np.uint8)
hist2d = np.histogram2d(r.ravel(), g.ravel(), bins=256, range=[[0, 256], [0, 256]])
hist2d[0][r, g]