OpenCV颜色检测
前言
绿幕技术是一种经典的视频编辑技术,可以用于将人物置于不同的背景中。例如在电影制作中,技术的关键在于演员不能身着特定颜色的衣服(比如绿色),站在只有绿色的背景前。然后,通过识别绿色像素,确定背景并替换这些像素上的内容。
策略分析
在本节中,我们将了解如何利用 cv2.inRange
和 cv2.bitwise_and
方法检测给定图像中的绿色像素,模型策略如下:
- 将图像从
RGB
转换为HSV
空间 - 指定
HSV
空间中对应绿色的上下限 - 识别绿色像素,生成掩码
mask
- 在原始图像和掩码图像之间执行按位与 (bitwise_and`)运算
根据颜色检测目标对象
(1) 导入所需库并加载图像:
import cv2, numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('5.jpeg', 1)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
(2) 将图像转换到 HSV
(Hue-Saturation-Value
) 空间,从 RGB
转换为 HSV
空间将亮度与颜色分离,以便可以轻松提取每个像素的颜色信息:
hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
(3) 定义 HSV
空间中绿色的上下阈值:
lower_green = np.array([45,100,100])
upper_green = np.array([80,255,255])
(4) 生成掩码,仅激活落在定义的上下阈值内的像素。cv2.inRange
是一种比较操作,用于检查像素值是否在最小值和最大值之间:
mask = cv2.inRange(hsv, lower_green, upper_green)
(5) 在原始图像和掩码之间执行 cv2.bitwise_and
操作以获取结果图像:
res = cv2.bitwise_and(img, img, mask=mask)
plt.subplot(131)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('Original image')
plt.subplot(132)
plt.imshow(mask, cmap='gray')
plt.title('Mask on image')
plt.subplot(133)
plt.imshow(cv2.cvtColor(res, cv2.COLOR_BGR2RGB))
plt.title('Resulting image')
plt.show()
从上图中可以看出,算法忽略了图像中的其余内容,只关注特定的颜色,使用此算法,可以使用 cv2.bitwise_not
操作生成一个非绿色的前景蒙版,并执行绿幕技术。
本节介绍了如何识别图像中的颜色空间,如果想将另一张图像叠加到识别的绿幕上,我们会选择另一幅图像中选择与原始图像中的绿色像素相对应的像素。