制作Pixel Histogram.ValueError:具有多个元素的数组的真值是不明确的

时间:2014-06-12 03:54:14

标签: python image image-processing numpy scipy

我正在尝试为图像制作像素直方图。我有一个名为 image 的数组,看起来像这样

array([[[ 0,  0, 18, ...,  3,  0, 11],
    [ 5, 18,  0, ..., 16, 16, 11],
    [13,  0,  5, ..., 13, 19, 14],
    ..., 
    [ 0,  0,  0, ...,  9,  0,  8],
    [ 4,  0,  0, ...,  0, 24,  0],
    [19, 12, 16, ...,  0, 16, 21]],

   [[17, 13,  0, ...,  9,  0,  0],
    [ 0,  0,  0, ...,  4,  0,  0],
    [14,  0,  2, ...,  0, 23,  0],
    ..., 
    [ 0,  6, 12, ...,  0, 22,  0],
    [ 0,  0, 20, ...,  9,  7,  0],
    [ 0,  8,  0, ...,  0, 15, 21]],

   [[ 4,  9,  3, ...,  0, 15, 20],
    [21, 16,  0, ...,  0,  8, 18],
    [ 0,  0,  0, ...,  0,  0, 18],
    ..., 
    [ 0, 10,  7, ..., 26,  0,  8],
    [15, 25, 16, ..., 17,  0, 18],
    [ 0, 11,  0, ..., 25,  0,  0]]], dtype=uint8)

我想使用list comphrehension修剪此列表,并仅保留大于某个最大值的值。但是Python正在抛出这个 ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all(),即使使用.any()或.all()使程序运行,它也不是理想的输出。如何仅保留列表中大于指定最大值的值?

y, x = image.shape[0],image.shape[1]
pixels = [image[j, i] \
          for i in range(x) \
          for j in range(y) \
          if image[j, i] < max_value]

1 个答案:

答案 0 :(得分:2)

根据您的条件创建一个布尔数组,并使用它来索引原始数组。

>>> img
array([[[200, 150,  80, 200],
        [200, 150,  80, 200],
        [200, 150,  80, 200]],

       [[200, 150,  80, 200],
        [200, 150,  80, 200],
        [200, 150,  80, 200]],

       [[200, 150,  80, 200],
        [200, 150,  80, 200],
        [200, 150,  80, 200]]])
>>> b = img < 100
>>> b
array([[[False, False,  True, False],
        [False, False,  True, False],
        [False, False,  True, False]],

       [[False, False,  True, False],
        [False, False,  True, False],
        [False, False,  True, False]],

       [[False, False,  True, False],
        [False, False,  True, False],
        [False, False,  True, False]]], dtype=bool)
>>> pixels = img[b]
>>> pixels
array([80, 80, 80, 80, 80, 80, 80, 80, 80])
>>> list(pixels)
[80, 80, 80, 80, 80, 80, 80, 80, 80]
>>>

或者简单地说:

>>> img[img < 100]
array([80, 80, 80, 80, 80, 80, 80, 80, 80])
>>>