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
指定比较应沿最后一个轴(-1
或 2
在这种情况下是等效的:-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
.
我已经成功地为使用
创建的给定图片的我想要的区域着色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
指定比较应沿最后一个轴(-1
或 2
在这种情况下是等效的:-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
.