我正在使用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
有没有一种有效的方法来解决这个问题?
答案 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]
以下是我得到的结果:
如果我想将绿地改为黄地怎么办?
im2[np.where((im2 == [0,255,0]).all(axis = 2))] = [0,255,255]
结果: