• 通过高分辨照片中激光图形对应的hsv值对图形进行提取



    前言

      想用颜色提取图像的纹理,但是图片分辨率较大,整幅图无法平铺屏幕,没办法靠鼠标点击事件输出。所以进行如下尝试获取图形的HSV值和范围。

    一、HSV是什么?

    1.颜色模型

    色调H
      用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;

    饱和度S
      饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。

    明度V
      明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。

    2.OpenCV中的HSV颜色体系

      与上述HSV颜色系统不同的是,如果直接使用OpenCV中cvtColor函数,并设置参数为CV_BGR2HSV,那么所得的H、S、V值范围分别是[0,180),[0,255),[0,255),而非[0,360],[0,1],[0,1];这时我们可以查下面的表格来确定颜色的大致区间。
    在这里插入图片描述

    二、使用步骤

    1.引入库

      利用print输出HSV对应的图像矩阵,注:np输出显示不全的情况,需要加上 np.set_printoptions(threshold=np.inf)

    import cv2
    import numpy as np
    np.set_printoptions(threshold=np.inf)
    
    img1 = cv2.imread('test1.png')
    grid_RGB = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
    grid_HSV = cv2.cvtColor(grid_RGB, cv2.COLOR_RGB2HSV)
    print(grid_HSV)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.筛选对应的HSV值

      我们处理的图像是墙面的激光图,不算复杂,所以只需要筛选出激光的HSV值就可以提取五角星图像。
    在这里插入图片描述
      从输出的矩阵中挑选图形大概对应的值。从上面一.2的表中选出大概对应的值。比如[140 7 115],可通过菜鸟工具中RGB HSV 转换器https://c.runoob.com/front-end/6214/#2e4a97输入查看对应的值是什么颜色。
    在这里插入图片描述
    在这里插入图片描述
      不过这个方法似乎不太友好,因为得到的HSV数值和opencv中需要的不一样,所以我用图像去色器https://c.runoob.com/front-end/6214/#2e4a97
    获取了RGB对应的数值,通过python转换了一下,写了一小段代码如下:

    在这里插入图片描述

    import cv2
    import numpy as np
    
    img_rgb = np.zeros([1,1,3], dtype=np.uint8)
    img_rgb[0,0,0] = 232
    img_rgb[0,0,1] = 108
    img_rgb[0,0,2] = 168
    print(img_rgb)
    RGB = img_rgb
    HSV = cv2.cvtColor(RGB, cv2.COLOR_BGR2HSV)
    print(HSV)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    该处使用的url网络请求的数据。

      这样就获取了HSV的值,我们就可以根据这个颜色范围提取图形啦

    3.对图形进行提取

    import cv2
    import numpy as np
    
    img1 = cv2.imread('test1.png')
    grid_HSV = cv2.cvtColor(img1, cv2.COLOR_RGB2HSV)
    lower = np.array([125, 43, 46])
    upper = np.array([155, 255, 255])
    HSV = cv2.inRange(grid_HSV, lower, upper)
    cv2.namedWindow("HSV", 0)
    cv2.imshow("HSV", HSV)
    cv2.waitKey()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    提取图形如下
    在这里插入图片描述
      考虑到可能是激光的光会发散的原因,所以又进行了如下尝试:
    通过过S 和 V 的值进行限定得出图形 :

    lower = np.array([125, 43, 220])
    upper = np.array([155, 90, 255])
    
    • 1
    • 2

    在这里插入图片描述


    常见的颜色RGB如下:

    白色:rgb(255,255,255)

    黑色:rgb(0,0,0)

    红色:rgb(255,0,0)

    绿色:rgb(0,255,0)

    蓝色:rgb(0,0,255)

    青色:rgb(0,255,255)

    紫色:rgb(255,0,255)

  • 相关阅读:
    C++-Mongoose(1)-http-server
    react钩子函数用法(useState、useEffect、useContext)
    LeetCode【46】全排列
    centos7安装keepalived 保证Nginx的高可用
    c++ 常用STL 之vector
    Unity3D学习之Lua热更新解决方案(一)AB包和LUA语法
    零基础入门学用Arduino 第三部分(三)
    【四旋翼飞行器】模拟四旋翼飞行器的平移和旋转动力学(Simulink仿真实现)
    C++17新特性
    FIR 基础应用 - AM 调幅波调制解调(FIR 低通滤波)
  • 原文地址:https://blog.csdn.net/weixin_43788282/article/details/127410127