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

ste*_*918 10 python opencv numpy

我正在使用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])
Run Code Online (Sandbox Code Playgroud)

但它不起作用,错误:

ValueError: array is not broadcastable to correct shape
Run Code Online (Sandbox Code Playgroud)

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

Abi*_*n K 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]]])
Run Code Online (Sandbox Code Playgroud)

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

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

>>> red[np.where((red == [0,0,255]).all(axis = 2))] = [0,255,255]
Run Code Online (Sandbox Code Playgroud)

现在检查红色.

>>> 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]]])
Run Code Online (Sandbox Code Playgroud)

希望这是你想要的.

检测结果:

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

我想将所有红色像素更改为黄色,如问题所示.

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

im2[np.where((im2 == [0,0,255]).all(axis = 2))] = [0,255,255]
Run Code Online (Sandbox Code Playgroud)

以下是我得到的结果:

在此输入图像描述

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

im2[np.where((im2 == [0,255,0]).all(axis = 2))] = [0,255,255]
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述