Opencv:如何检测像素颜色变化

Opencv: How to detect pixel color change

我已经成功地为使用

创建的给定图片的我想要的区域着色
numpy (`img = np.zeros((512,512,3), np.uint8)`).

我用OpenCV显示图片

cv2.imshow()

使用鼠标光标着色后,我保存图片。

如何检测图像的给定像素的颜色已被修改?

一般来说,比较两个数组可以用常用的==<!=等运算符来完成。比较returns一个布尔值(True/False)数组:

import numpy as np

x = np.array([0, 1, 2, 3, 4])
y = np.array([9, 1, 2, 3, 7])

arrays_equal = x == y

arrays_equal 将是一个布尔数组,True它们相等,False它们不相等:

array([False,  True,  True,  True, False], dtype=bool)

但是,还有一个额外的注意事项,因为您正在处理图像数据。你最终可能想要得到的是一个 2D 数组,其中任何颜色都发生了变化,但你正在比较两个 3D 数组,所以你会得到一个 3D 布尔数组作为输出。

例如:

im = np.zeros((5,5,3), dtype=np.uint8)
im2 = im.copy()

# Change a pixel in the blue band:
im2[0,0,2] = 255

# The transpose here is just so that the bands are printed individually 
print (im == im2).T

这将产生:

[[[ True  True  True  True  True]
  [ True  True  True  True  True]
  [ True  True  True  True  True]
  [ True  True  True  True  True]
  [ True  True  True  True  True]]

 [[ True  True  True  True  True]
  [ True  True  True  True  True]
  [ True  True  True  True  True]
  [ True  True  True  True  True]
  [ True  True  True  True  True]]

 [[False  True  True  True  True]
  [ True  True  True  True  True]
  [ True  True  True  True  True]
  [ True  True  True  True  True]
  [ True  True  True  True  True]]]

当然,您可能想要更像上一个乐队的东西。

在这种情况下,您想使用 np.all 来 "reduce" 东西并得到一个二维数组,其中 任何像素中的任何颜色 都是不同的.

为此,我们将使用 axis kwarg 到 np.all 指定比较应沿最后一个轴(-12在这种情况下是等效的:-1 仅表示 "last"):

np.all(im == im2, axis=-1)

产生:

array([[False,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True]], dtype=bool)

还要注意,如果你需要 "flip" 这个数组,你可以使用 != 运算符和 np.any 而不是 np.all 或者你可以反转结果使用 ~ (在 numpy 中不符合逻辑)运算符。例如。 opposite = ~boolean_array.