版本:
Python:3.7
OpenCV: 4.5.5
步骤:
1、将图片转到HSV色彩空间;
2、设定H、S、V三值的范围;
参考链接:OpenCV中HSV颜色模型及颜色分量范围 - wangyblzu - 博客园
注:红色的H有俩个范围(0-10和156-180)
3、使用OpenCV中inRange()函数将输入的HSV图筛选出符合上述H、S、V的二值图像;
4、使用两个范围会得到两个二值图像(类似于互为补集的情况),将两个二值图像进行相加操作,会得到较完整的红色区域;
注:(1)H的取值范围按链接中推荐的即可;
(2)S的取值范围如按链接中推荐的范围会将肤色识别为红色,所以需要将下限值调高一些(例如下限值在100~180之间);
(3)V的取值范围按链接中推荐的范围即可,因为当有东西遮在上面而处于阴影中时,低下限值的作用就很明显。
测试源码:
import cv2
import numpy as np
if __name__ == "__main__":
img = cv2.imread('Picture12.jpg')
# 在彩色图像的情况下,解码图像将以b g r顺序存储通道。
grid_RGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 从RGB色彩空间转换到HSV色彩空间
grid_HSV = cv2.cvtColor(grid_RGB, cv2.COLOR_RGB2HSV)
# H、S、V范围一:
lower1 = np.array([0,43,46])
upper1 = np.array([10,255,255])
mask1 = cv2.inRange(grid_HSV, lower1, upper1) # mask1 为二值图像
res1 = cv2.bitwise_and(grid_RGB, grid_RGB, mask=mask1)
# H、S、V范围二:
lower2 = np.array([156,43,46])
upper2 = np.array([180,255,255])
mask2 = cv2.inRange(grid_HSV, lower2, upper2)
res2 = cv2.bitwise_and(grid_RGB,grid_RGB, mask=mask2)
# 将两个二值图像结果 相加
mask3 = mask1 + mask2
# 结果显示
cv2.imshow("mask3", mask3)
cv2.imshow("img",img)
cv2.imshow("Mask1",mask1)
cv2.imshow("res1",res1)
cv2.imshow("Mask2",mask2)
cv2.imshow("res2",res2)
cv2.imshow("grid_RGB", grid_RGB[:,:,::-1]) # imshow()函数传入的变量也要为b g r通道顺序
cv2.waitKey(0)
cv2.destroyAllWindows()
测试图片:
结果图片:显示mask3