Opencv入门系列三

Opencv入门系列三


主要内容:

  • 色彩空间类型
  • 色彩空间之间的转换
  • 实例分析
  • HSV色彩空间标记特地颜色

1.色彩空间类型

RGB色彩空间

GRAY色彩空间(灰度图像)

XYZ色彩空间

YCrCb色彩空间

HSV色彩空间

HLS色彩空间

CIELab*色彩空间

CIELuv色彩空间

Bayer色彩空间

不同的色彩空间擅长处理不同的问题。

1.1 Gray色彩空间

GRAY:灰度图像,其中灰度值由0-255构成八位二进制数。

RGB图像转化为Gray图像的公式如下:

image-20210130195621441

①:不同的RGB色彩通道对应了不同的权值总和为1

Gray图像转化为RGB图像的公式如下:

image-20210130210315639

1.2 XYZ色彩空间

XYZ:一种便于计算的色彩空间。

XYZ图像转化为RGB图像的公式如下:

image-20210130195950725

反之:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZDihOeDT-1612015331156)(https://i.loli.net/2021/01/30/9KbozyFNeI4hGtH.png)]

1.3YCrCb色彩空间

YCrCb:一种更能描述人眼视觉的色彩空间

  • Y:光亮
  • Cr和Cb:Cr表示红色色度,Cb表示蓝色色度

RGB图像转化为YCrCb图像的公式如下:

image-20210130200352674

delta值:

image-20210130200447877

反之:

image-20210130201447167

1.4 HSV色彩空间

HSV色彩空间从心理学和视觉的角度出发。

  • 色调(Hue,也称为色相)色调指光的颜色,色调与混合光谱中的主要光波长相关。色调的取值区间为[0, 360]。

  • 饱和度(Saturation)饱和度是指色彩的深浅程度,指一种颜色混合白光的数量。饱和度取值范围是[0, 1]

  • 亮度(Value)亮度指人眼感受到的光的明暗程度。指的是颜色能掺入白色的多少。亮度取值范围也是[0, 1]

在HSV色彩空间中,H通道(饱和度Hue通道)对应不同的颜色。或者换个角度理解,颜色的差异主要体现在H通道值的不同上。所以,通过对H通道值进行筛选,便能够筛选出特定的颜色。

色调对应部分颜色如下表:

image-20210130202104111

根据上述分析可知,每个色调值对应一个指定的色彩,而与饱和度和亮度无关。确定值范围后,就可以直接在图像的H通道内查找对应的值,从而找到特定的颜色。通过分析各种不同对象对应的HSV值,便可以查找不同的对象。

例如,通过分析得到肤色的HSV值,就可以直接在图像内根据肤色的HSV值来查找人脸(等皮肤)区域

注意:在从RGB/BGR色彩空间转换到HSV色彩空间时,OpenCV为了满足8位图的要求,对HSV空间的值进行了映射处理。所以,通过软件或者网站获取的HSV值还需要被进一步映射,才能与OpenCV中的HSV值一致。

RGB色彩空间转换到HSV色彩空间之前,需要先将RGB色彩空间的值转换到[0,1]之间,再通过一下公式:

image-20210130202313297

若出现H<0的情况,将加上一个周期如:

image-20210130202446506

1.5 HLS色彩空间

HLS:将HSV中的V:亮度换成了L:光亮度/明度

  • 色调H(Hue):如同HSV中的色调,用一个360度的色环表示。

  • 光亮度/明度L(Lightness):用来控制色彩的明暗变化,它的取值范围也是[0, 1]。

  • 饱和度S(Saturation):如同HSV中的色调。

1.6 CIELab色彩空间

CIELab色彩空间是均匀色彩空间模型,它是面向视觉感知的颜色模型。人所感知到的两种颜色的区别程度,应该与这两种颜色在色彩空间中的距离成正比。在某个色彩空间中,如果人所观察到的两种颜色的区别程度,与这两种颜色在该色彩空间中对应的点之间的欧式距离成正比,则称该色彩空间为均匀色彩空间。

  • L:分量用于表示像素的亮度,取值范围是[0,100],表示从纯黑到纯白。

  • A:分量表示从红色到绿色的范围,取值范围是[-127,127]。

  • B:分量表示从黄色到蓝色的范围,取值范围是[-127,127]。

RGB色彩空间转换到CIELab*色彩空间

①:需要先将RGB色彩空间的值转换到[0, 1]之间

②:RGB色彩空间转换到XYZ色彩空间

③:XYZ色彩空间转换到CIELab*色彩空间(LAB是在XYZ的基础上上发展来的所以需要中间转换)

具体实现如下:

image-20210130203803507

delta值为:

image-20210130203734933

1.7CIELuv色彩空间

CIELuv也是均匀的颜色模型,适用于显示器显示和根据加色原理进行组合的场合,该模型中比较强调对红色的表示,即对红色的变化比较敏感,但对蓝色的变化不太敏感。

  • L:取值范围为[0 - 100]
  • U:取值范围为[-134 - 220]
  • V:取值范围为[-140 - 122]

具体实现如下:

①:先转化为XYZ色彩空间。

image-20210130204024441

②:再化为LUV色彩空间。

image-20210130204120222

1.8 Bayer色彩空间

Bayer色彩空间(Bayer模型)被广泛地应用在CCD和CMOS相机中。它能够从单平面R、G、B交错表内获取彩色图像。输出的RGB图像的像素点值,是根据当前点的1个、2个或4个邻域像素点的相同颜色的像素值获得的。

Bayer有许多种模式例如如下模式:

image-20210130204553847

2.opencv中的色彩空间转换

  • cv2.cvtColor()函数实现所有色彩空间的转换。其语法格式如下:

    image-20210130204810351

● dst:转化后的图像,与原始输入图像具有同样的数据类型和深度。

● src:原始图像。

● code:是色彩空间转换码。

● dstCn:是目标图像的通道数。如果参数为默认的0,则通道数自动通过原始输入图像和code得到。

色彩空间转换码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FKzjrsgP-1612015331172)(https://i.loli.net/2021/01/30/KvYIWxSAo8EwZDd.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JaR9SlKQ-1612015331173)(https://i.loli.net/2021/01/30/AjuZLTX8lybhYdw.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RuK9QzIz-1612015331175)(https://i.loli.net/2021/01/30/n9LdqtbXITvhPBo.png)]

image-20210130205209981

image-20210130205222468

image-20210130205233622

图像的数据类型如下:

● 8位图像值的范围是[0,255]。

● 16位图像值的范围是[0,65 535]。

● 浮点数图像值的范围是[0.0~1.0]

3.程序实验

使用函数cv2.cvtColor()实现BGR到RGB和Gray图像的转化

import cv2
import numpy as np

loadImg = cv2.imread("Resources/lena.png",1)
w,h,t = loadImg.shape
print(loadImg.shape)
print(loadImg.size)
print(loadImg.dtype)

GrayImg = cv2.cvtColor(loadImg,code=cv2.COLOR_BGR2GRAY)
BRGImg = cv2.cvtColor(loadImg,code=cv2.COLOR_BGR2RGB)

cv2.namedWindow("loadImg")
cv2.namedWindow("GrayImg")
cv2.namedWindow("BRGImg")
cv2.imshow("loadImg",loadImg)
cv2.imshow("GrayImg",GrayImg)
cv2.imshow("BRGImg",BRGImg)

cv2.waitKey(0)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w9Vru24c-1612015331181)(https://i.loli.net/2021/01/30/rOKqfiPWvIzLQ1e.png)]

4.标记特定颜色

4.1 cv2.inRange()

cv2.inRange()来判断图像内像素点的像素值是否在指定的范围内,其语法格式为:

image-20210130212520152

● dst:表示输出结果,大小和src一致。

● src:表示要检查的数组或图像。

● lowerb:表示范围下界。

● upperb:表示范围上界。

lowerb和upperb:对于不同的色彩空间传递的参数形式有差异。

工作机制如下:

①:dst图像与src图像等大小,

②:des图像的像素值取决于src中对应位置上的值是否处于区间[lowerb, upperb]内:

● 如果src值处于该指定区间内,则dst中对应位置上的值为255。

● 如果src值不处于该指定区间内,则dst中对应位置上的值为0。

注意:通过inRange()处理的函数仅仅剩下0和255(即掩膜图像)另一种掩膜图像是二进制图像只有0和1,掩膜图像进行按位逻辑操作可以提取目标像素部分图像,提取感兴趣区域。

程序实验

使用HSV色彩空间进行颜色识别。

注意:在实际提取颜色时,往往不是提取一个特定的值,而是提取一个颜色区间该区间的半径通常为10左右,例如通常提取[120-10,120+10]范围内的值来指定蓝色。相比之下,HSV模式中S通道、V通道的值的取值范围一般是[100,255]。这主要是因为,当饱和度和亮度太低时,计算出来的色调可能就不可靠了。

import cv2
import numpy as np

#使用不同色彩空间提取出的信息可以引用于所有类型空间中
loadImg = cv2.imread("Resources/shapes.png",3)
print(loadImg)
cv2.imshow("loadImg",loadImg)
HsvImg = cv2.cvtColor(loadImg,cv2.COLOR_BGR2HSV)
print(HsvImg)

BlueLow = np.array([110,100,100])
BlueHign = np.array([130,255,255])
BlueMask = cv2.inRange(HsvImg,BlueLow,BlueHign)
BlueImg = cv2.bitwise_and(loadImg,loadImg,mask=BlueMask)
cv2.imshow("BlueImg",BlueImg)
print(BlueMask)

GreenLow = np.array([50,100,100])
GreenHign = np.array([70,255,255])
GreenMask = cv2.inRange(loadImg,GreenLow,GreenHign)
GreenImg = cv2.bitwise_and(loadImg,loadImg,mask=GreenMask) #自身和自身相与为本身,mask:为零部分像素点为0,非零为原值
cv2.imshow("GreenImg",GreenImg)
print(GreenMask)

RedLow = np.array([0,100,100])
RedHign = np.array([10,255,255])
RedMask = cv2.inRange(loadImg,RedLow,RedHign)
RedImg = cv2.bitwise_and(loadImg,loadImg,mask=RedMask)
cv2.imshow("RedImg",RedImg)
print(RedMask)
cv2.waitKey(0)

image-20210130215453756

5.alpha通道

alpha通道:通常称为A通道,表示透明度。

例如:BGR加上A通道为:BGRA

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值