ndarray中列表的出现

时间:2019-07-03 08:28:22

标签: python numpy image-processing numpy-ndarray

我有一个RGB图像-ndarray-,我想计算该图像中[255,0,0]或[0,0,255]等某些颜色的出现。

图像数据示例

np.ones((3, 3, 3)) * 255

array([[[255., 255., 255.],
        [255., 255., 255.],
        [255., 255., 255.]],
       [[255., 255., 255.],
        [255., 255., 255.],
        [255., 255., 255.]],
       [[255., 255., 255.],
        [255., 255., 255.],
        [255., 255., 255.]]])

因此,我想要这样的东西

{
'[255,255,255]' : 9,
}

3 个答案:

答案 0 :(得分:4)

一种解决方案可以是Counter函数:

from collections import Counter
import numpy as np

# Generate some data
data = np.ones((10, 20, 3)) * 255

# Convert to tuple list
data_tuple = [ tuple(x) for x in data.reshape(-1,3)]
Counter(data_tuple)

返回:

Counter({(255.0, 255.0, 255.0): 200})

答案 1 :(得分:3)

尽管可以使用Counteropencv histogram function计算每个像素的频率,但对于特定像素,使用此像素更有效:

import numpy as np

ar = np.ones([3,3,3]) *255
ar[1,1,:] = [0, 0, 200]

pixels = dict()
pixels['[255, 255, 255]'] =  np.sum(np.all(ar == [255,255, 255], axis = 2))
pixels['[0, 0, 200]'] =  np.sum(np.all(ar == [0, 0, 200], axis = 2)) 

结果:{'[255, 255, 255]': 8, '[0, 0, 200]': 1}

答案 2 :(得分:1)

这是使用NumPy的方法。作为介于0-255范围内的值,我们可以将行视为具有三个f8类型的元素的元组,并使用np.unique来计算原始ndarray中实际行的出现次数。使用nakor的数组:

a = np.ones((10, 20, 3)) * 255

然后我们可以这样做:

vals, counts = np.unique(a.view('f8,f8,f8'), return_counts=True)

位置:

print(vals)
array([(255., 255., 255.)],
      dtype=[('f0', '<f8'), ('f1', '<f8'), ('f2', '<f8')])

print(counts)
array([200])