识别红色区域(python+opencv)

版本:

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()

测试图片:

识别红色区域(python+opencv)_第1张图片

结果图片:显示mask3

识别红色区域(python+opencv)_第2张图片

你可能感兴趣的:(python,opencv)