2012-07-11 102 views
8

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

我问如何色调分离的图像previous question,并从答案,我学到了索引与索引的数组,为前: 图像[图像> 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 2012-07-11 13:55:49

+0

嗨,你想创建一个图像与所有元素[0,255,255]或只是改变图像中的所有元素值[0,0,255]到[0,255,255]? – 2012-07-11 14:04:37

+0

嗨,我想改变图像中的所有元素值[0,0,255]到[0,255,255],谢谢 – steve8918 2012-07-11 14:11:53

回答

14

考虑像阵列的图像,如下:

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

+0

是的,谢谢你,这是完美的!一个后续问题:为什么术语“red == [0,0,255]”有效? ==是否适用于numpy数组比较?我以为我不得不使用“相等” – steve8918 2012-07-11 14:27:02

+0

对不起,我没有得到这个问题。 – 2012-07-11 14:30:00

+0

哎呀,忽略这个问题,我想我混了自己。再次感谢! – steve8918 2012-07-11 14:36:28