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

11
我正在使用Python的OpenCV。 我有一张图片,想要做的是将所有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

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


2
我需要一个Python的答案,最好使用NumPy中可用的东西,而不是C++,这样就不会重复了。 - steve8918
你好,你想创建一个所有元素为[0,255,255]的图像,还是只想将值为[0,0,255]的图像中的所有元素更改为[0,255,255]? - Abid Rahman K
嗨,我想将图像中所有值为[0,0,255]的元素更改为[0,255,255],谢谢。 - steve8918
1个回答

20
考虑下面这样的图像数组:

Consider an image like array as below :


>>> 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://dev59.com/NGgu5IYBdhLWcg3wzKEc#11072667 我想按照问题所要求的将所有红色像素更改为黄色。
因此,我在末尾添加了以下代码片段:
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]

结果:

输入图像描述


嘿,我有一个问题。如果我需要将所有BGR值范围内的像素设置为另一个值而不是特定像素值,有没有办法利用这个方法?谢谢! - annena
我正在尝试这个例子,但图像没有变化 im = cv2.imread('it_captcha_green.jpg') im[np.where((im == [140, 230, 140]).all(axis=2))] = [0, 0, 0] cv2.imshow('灰度图像',im) - Jeya Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接