OpenCV:将特定BGR值的所有像素设置为另一个BGR值

时间:2012-07-11 13:20:26

标签: python opencv numpy

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

我问了previous question关于如何对图像进行分色的问题,并从我学到的关于使用索引数组索引的答案中获得了答案,例如:    图像[图像> 128] = 255

我理解这是如何工作的,因为图像> 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

有没有一种有效的方法来解决这个问题?

1 个答案:

答案 0 :(得分:16)

考虑像下面这样的图像:

>>> 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]

以下是我得到的结果:

enter image description here

如果我想将绿地改为黄地怎么办?

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

结果:

enter image description here