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

时间:2015-02-05 13:14:59

标签: python python-2.7 opencv numpy

我已经成功地将我想要的区域着色为使用

创建的给定图片
numpy (`img = np.zeros((512,512,3), np.uint8)`).

我使用OpenCV显示图片

cv2.imshow()

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

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

1 个答案:

答案 0 :(得分:1)

通常,可以使用通常的==<!=等运算符来比较两个数组。比较返回一个布尔(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阵列,所以你&#39;我将得到一个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使用&#34;减少&#34;事情向下并得到一个二维数组,其中任何像素中的任何颜色都不同。

要执行此操作,我们会使用axis kwarg np.all指定比较应沿最后一个轴(-12进行在这种情况下是等价的:-1只是意味着&#34;最后&#34;):

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)

另请注意,如果您需要&#34;翻转&#34;对于此数组,您可以将!=运算符与np.any而不是np.all一起使用,也可以使用~(逻辑非numpy)运算符反转结果。例如。 opposite = ~boolean_array