• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    python-opencv中的cv2.inRange函数用法说明

    本次目标是将一副图像从rgb颜色空间转换到hsv颜色空间,颜色去除白色背景部分

    具体就调用了cv2的两个函数,一个是rgb转hsv的函数

    具体用法

    hsv = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2HSV)

    然后利用cv2.inRange函数设阈值,去除背景部分

    mask = cv2.inRange(hsv, lower_red, upper_red) #lower20===>0,upper200==>0,

    函数很简单,参数有三个

    第一个参数:hsv指的是原图

    第二个参数:lower_red指的是图像中低于这个lower_red的值,图像值变为0

    第三个参数:upper_red指的是图像中高于这个upper_red的值,图像值变为0

    而在lower_red~upper_red之间的值变成255

    lower_red = np.array([20, 20, 20])
    upper_red = np.array([200, 200, 200])
    mask = cv2.inRange(hsv, lower_red, upper_red) #lower20===>0,upper200==>0,lower~upper==>255

    就是将低于lower_red和高于upper_red的部分分别变成0,lower_red~upper_red之间的值变成255

    具体用法如下

     hsv = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2HSV)
     lower_red = np.array([20, 20, 20])
     upper_red = np.array([200, 200, 200])
     # mask -> 1 channel
     mask = cv2.inRange(hsv, lower_red, upper_red) #lower20===>0,upper200==>0

    补充:色彩阀值化处理——openCV-python中inRange()等相关函数实测

    色彩阀值化

    在图像处理的过程中,使用各种形态学操作或者滤波的方式来突显我们关注的元素,同时降低噪声并减少干扰我们提取关键元素的影响项。除了这些方法外,我们可以在原图中先依据颜色的特征,提取出更为关键的像素。就像车道检测时,一般车道只有两种颜色:黄色和白色。所以我们可以在 RGB 色彩空间(Color Space) 对这两种颜色进行过滤从而提取出车道线的像素。

    色彩空间:使用一组值(通常使用三个、四个值或者颜色成分)表示颜色方法的抽象数学模型。有利用原色相混的比例表示的色彩空间,如 RGB (Red, Green, Blue) 颜色空间; 也有利用不同的概念表示的色彩空间,如 HSV (色相 hue, 饱和度 saturation, 明度 value) 以及 HSL (色相 hue,饱和度 saturation,亮度 lightness/luminance) 。

    在OpenCV中,RGB三通道的图像的读取 cv2.imread() 的结果是以 BGR 顺序排列的,而在使用matplotlib的 plt.imread() 时, 读取的通道排列顺序则为 RGB 。因此此处应当注意区别。

    openCV中cv2.inRange()函数是实现该功能的关键,我们先看看官网对该函数的定义:

    dst = cv.inRange( src, lowerb, upperb[, dst] )

    检测数组元素是否位于其他两个元素之间。

    该函数检测范围方式如下:

    对于单通道输入的每个元素:

    对于双通道输入:

    同样应用于四通道

    也就是说,如果src (I)在指定的1D, 2D, 3D,…框内则dst(I)为255,否则为0。当下边界和/或上边界参数为标量时,应省略上述公式中在上、下边界处的索引(I)。

    各参数详细含义:

    src 输入的数组

    lowerb 下边界数组或标量.

    upperb 上边界数组或标量.

    dst 与src和CV_8U类型大小相同的输出数组。

    接下来将结合简单的例子通过python更好地理解这个函数:

    import matplotlib.pyplot as plt
    import numpy as np
    import cv2
    # 对图片进行读取
    img_cv2 = cv2.imread('D:\\test\\CVtest.jpg')
    print(img_cv2)
    

    为了方便理解,我用画板工具画了一个5×5像素点的红色图片。上述代码运行结果为:

    [[[ 36  27 237]
      [ 36  27 237]
      [ 36  27 237]
      [ 36  27 237]
      [ 36  27 237]]
     [[ 36  27 237]
      [ 36  27 237]
      [ 36  27 237]
      [ 36  27 237]
      [ 36  27 237]]
     [[ 36  27 237]
      [ 36  27 237]
      [ 36  27 237]
      [ 36  27 237]
      [ 36  27 237]]
     [[ 36  27 237]
      [ 36  27 237]
      [ 36  27 237]
      [ 36  27 237]
      [ 36  27 237]]
     [[ 36  27 237]
      [ 36  27 237]
      [ 36  27 237]
      [ 36  27 237]
      [ 36  27 237]]]
    

    读者可以自行测试一下,B=36,G=27,R=237为红色。

    # 创建RGB色彩空间
    color_Low1 = np.array([30,27,237])
    color_Low2 = np.array([39,27,237])
    color_High = np.array([40,27,237])
    # 对图片进行阀值化处理
    img_dst1 = cv2.inRange(img_cv2,color_Low1,color_High)
    img_dst2 = cv2.inRange(img_cv2,color_Low2,color_High)
    #对结果进行打印
    print(img_dst1,'\n', img_dst2)
    # 运行结果分别为
    [[255 255 255 255 255]
     [255 255 255 255 255]
     [255 255 255 255 255]
     [255 255 255 255 255]
     [255 255 255 255 255]]
     [[0 0 0 0 0]
     [0 0 0 0 0]
     [0 0 0 0 0]
     [0 0 0 0 0]
     [0 0 0 0 0]]
    

    可以看出,当图片中的像素点落在色彩空间时,输出结果全是255,当像素点不落在色彩空间是,输出结果全是0。对最终结果进行显示:

    #对图像进行展示
    cv2.imshow("origin_img",img_cv2)
    cv2.imshow("dst_img1",img_dst1)
    cv2.imshow("dst_img2",img_dst2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    最终结果为一个红色、一个黑色的、一个白色的小点。

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

    您可能感兴趣的文章:
    • python中的内置函数max()和min()及mas()函数的高级用法
    • python print()函数的end参数和sep参数的用法说明
    • python处理emoji表情(两个函数解决两者之间的联系)
    • 解决python2中unicode()函数在python3中报错的问题
    • python绘图subplots函数使用模板的示例代码
    • Python input()函数用法大全
    • python Pool常用函数用法总结
    • python 如何用map()函数创建多线程任务
    • Python函数参数中的*与**运算符
    • 详解python函数传参传递dict/list/set等类型的问题
    • Python3去除头尾指定字符的函数strip()、lstrip()、rstrip()用法详解
    • Python进阶之高级用法详细总结
    上一篇:使用python和opencv的mask实现抠图叠加
    下一篇:python-pandas创建Series数据类型的操作
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    python-opencv中的cv2.inRange函数用法说明 python-opencv,中的,cv2.inRange,