zoukankan      html  css  js  c++  java
  • 【opencv_python学习之三】图像处理(一)更改色彩模式

    1、修改颜色模式

    1.1、相关知识介绍

    • 颜色模式:是将某种颜色表现为数字形式的模型,或者说是一种记录图像颜色的方式。分为:RGB模式、CMYK模式、HSB模式、Lab颜色模式、位图模式、灰度模式、索引颜色模式、双色调模式和多通道模式。

    • RGB模式:利用了红、绿、蓝三原色的原理展现色彩,对机器比较友好,是最传统的方式,电视机等屏幕就是采用这种方式。

    • HSB模式:也叫做HSV,利用色相、饱和度、明度的原理展现色彩,对人类比较友好。

    • 灰度模式: 用单一色调表现图像,用0到255的不同灰度值来表示图像, 0表示黑色, 255表示白色。

    • HSV(HSB)模式的范围
      8-bit图片中
      PS中的HSV范围,H是0-360,S是0-1,V(B)是0-1
      opencv中的HSV范围,H是0-180,S是0-255,V是0-255
      转换方式
      把PS中H的值除以2,S乘255,V乘255,可以得到对应的opencv的HSV值

    1.2、提取图片中的粉色

    1.2.1、思路

    a. 加载图片c.png
    b. 将图片c.png从RGB模式改成HSV模式
    c. 选取粉色区域

    这里为什么要转成HSV模式而不是直接使用RGB模式,有些疑惑,于是我按照RGB模式取了粉色区域,运行后发现并没有选取出来。所以猜测,转成HSV后区域是连贯的,可使用inRange选区。

    1.2.2、代码

    import cv2
    import numpy as np
    
    img = cv2.imread('c.png')
    
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    lower_pink = np.array([160,20,20])
    upper_pink = np.array([168,255,255])
    mask = cv2.inRange(hsv, lower_pink, upper_pink)
    
    res = cv2.bitwise_and(img, img, mask= mask)
    
    cv2.imshow('frame',img)
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    1.2.3、运行结果

    图 1.1

    1.2.4、知识点

    • imread
    函数:  cv2.imread(filename[, flags]) → retva
    描述:  读取一张图片, 并返回图片句柄
    参数:  filename[要加载的图片路径]
           flags[加载图片的data type, 具体参考备注1]
    返回:  retva[图片句柄]
    备注1: >0[三通道图片]
           =0[灰阶图片]
           <0[带透明通道的图片]
    备注2: 支持的图片 *.bmp, *.dib, *.jpeg, *.jpg, *.jpe, *.jp2, *.png, *.pbm, *.pgm, *.ppm, *.sr, *.ras, *.tiff, *.tif
    
    • cvrColor
    函数:  cv2.cvtColor(src, code[, dst[, dstCn]]) →  dst
    描述:  将图片从一种颜色模式转成另一种颜色模式
    参数:  src[要转换的源图片, 可以是uint8、uint16或float等]
           dst[转换后的目标图片]
           code[转换标识符, 具体见备注1]
    返回:  dst[转换后的目标图片]
    备注1:RGB与GRAY转换的标识有[CV_BGR2GRAY, CV_RGB2GRAY, CV_GRAY2BGR, CV_GRAY2RGB]
           RGB与CIE XYZ.Rec的转换标识有[CV_BGR2XYZ, CV_RGB2XYZ, CV_XYZ2BGR, CV_XYZ2RGB]
           RGB与YCrCb的转换标识有[CV_BGR2YCrCb, CV_RGB2YCrCb, CV_YCrCb2BGR, CV_YCrCb2RGB] 
           RGB与HSV的转换标识有[CV_BGR2HSV, CV_RGB2HSV, CV_HSV2BGR, CV_HSV2RGB] 
           RGB与CIE L*a*b*的转换标识有[CV_BGR2Lab, CV_RGB2Lab, CV_Lab2BGR, CV_Lab2RGB]
           RGB与CIE L*u*v* 的转换标识有[CV_BGR2Luv, CV_RGB2Luv, CV_Luv2BGR, CV_Luv2RGB]
           RGB与Bayer的转换标识有[CV_BayerBG2BGR, CV_BayerGB2BGR, CV_BayerRG2BGR, CV_BayerGR2BGR, CV_BayerBG2RGB, CV_BayerGB2RGB, CV_BayerRG2RGB, CV_BayerGR2RGB]
    

    转换标识诸如cv2.COLOR_BGR2HSV这类,可以使用以下方式查看所有的标识

    >>> import cv2
    >>> flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
    >>> print flags
    
    • inRange
    函数: cv2.inRange(src, lowerb, upperb[, dst]) → dst
    描述: 检查数组srv是否在lowerb数组和upperb数组之间, 将svr中符合条件的值置为255,不符合条件的值置为0
    参数: src[要检查的数组]
          lowerb[检查条件的下界]
          upperb[检查条件的上界]
    返回: dst[经过筛选处理后的数组(0和255组成)]
    
    • bitwise_and
    函数: cv2.bitwise_and(src1, src2[, dst[, mask]]) → dst
    描述: 将src1和src2以mask方式按位合并
    参数: src1[要操作的源数组1]
          src2[要操作的源数组2]
          mask[标识, 标识了哪些位置要按位合并(255合并, 0置为0)]
    返回: dst[处理后的数组]
    
    • 如何通过RGB获取HSV的颜色值

    可以参考以下方法

    >>> green = np.uint8([[[0,255,0 ]]])
    >>> hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
    >>> print hsv_green
    [[[ 60 255 255]]]
    

    附录

    在本篇文章中所有示例所处理的图片为下图0.1,图片名字为a.png。

    图 0.1

    下图0.2, 图片名字为b.png

    图 0.2

    下图0.3, 图片名字为c.png

    图 0.3

    本文参考文章

    Changing Colorspaces

    【opencv】目标识别——HSV颜色识别

    Operations on Arrays

    Miscellaneous Image Transformations

  • 相关阅读:
    idea注释模板配置
    component-scan中base-package包含通配符
    mysql查询datetime大于下午3点的数据
    Linux c 开发-4 使用QT远程调试Linux程序
    Linux c 开发-3 配置ubuntu子系统桌面环境
    Linux c 开发-2 配置Vs2019
    Linux c 开发-1 Ubuntu子系统18.04开启SSH
    STM32 例程-5 Proteus使用串口2
    STM32 例程-4 Proteus下串口发送数据
    STM32 例程-3 Proteus下单按键试验
  • 原文地址:https://www.cnblogs.com/featherw/p/7610803.html
Copyright © 2011-2022 走看看