11

我正在将 OpenCV 与 Python 一起使用。我有一个图像,我想要做的是将 BGR 值 [0, 0, 255] 的所有像素设置为 [0, 255, 255]。

我问了一个关于如何对图像进行后处理的问题,并从答案中我了解到使用索引数组进行索引,例如:image[image > 128] = 255

我了解这是如何工作的,因为 image > 128 将返回一个满足条件的多维索引数组,然后我将此数组应用于图像并将其设置为 255。但是,我对如何将其扩展到为数组做一个值。

我尝试执行以下操作:

      red = np.array([0, 0, 255])
      redIndex = np.where(np.equal(image, red))
      image[redIndex] = np.array([0, 255, 255])

但它不起作用,出现错误:

ValueError: array is not broadcastable to correct shape

有没有一种有效的方法来处理这个问题?

4

1 回答 1

19

考虑一个像数组这样的图像,如下所示:

>>> red
array([[[  0,   0, 255],
        [  0,   0, 255],
        [  0,   0, 255],
        [  0,   0, 255],
        [  0,   0, 255]],

       [[  0,   0, 255],
        [  0,   0, 255],
        [  0,   0, 255],
        [  0,   0, 255],
        [  0,   0, 255]]])

它的所有元素都是[0,0,255]。它的形状是 2x5x3。试想其中还有其他价值。(我无法创建所有这些)。

现在您找到 [0,0,255] 的位置并将它们更改为 [0,255,255]。你可以这样做:

>>> red[np.where((red == [0,0,255]).all(axis = 2))] = [0,255,255]

现在检查红色。

>>> red
array([[[  0, 255, 255],
        [  0, 255, 255],
        [  0, 255, 255],
        [  0, 255, 255],
        [  0, 255, 255]],

       [[  0, 255, 255],
        [  0, 255, 255],
        [  0, 255, 255],
        [  0, 255, 255],
        [  0, 255, 255]]])

希望这是你想要的。

测试结果:

查看此链接中的代码:https ://stackoverflow.com/a/11072667/1134940

我想按照问题将所有红色像素更改为黄色。

所以我在最后添加了这段代码:

im2[np.where((im2 == [0,0,255]).all(axis = 2))] = [0,255,255]

下面是我得到的结果:

在此处输入图像描述

如果我想将绿色地面改为黄色地面怎么办:

im2[np.where((im2 == [0,255,0]).all(axis = 2))] = [0,255,255]

结果 :

在此处输入图像描述

于 2012-07-11T14:15:00.957 回答