作者:云时之间 来源:知乎 链接:https://zhuanlan.zhihu.com/p/103387082 编辑:王萌

在这一篇文章中,我们将会学习使用一下OpenCV中色彩空间的转换函数,我们这里说的色彩空间是说的使用多种颜色(通常指三种以上),来表示颜色的方法,像是我们平时所说的RGB,HSV,YUV,YCRCB,都是色彩空间模型。OpenCV也很方便的封装了很多的色彩空间函数。下面我们一起来实践一下(以下所有试验都根据下图完成,我截取的Windows自带的壁纸^_^)

一:RGB

RGB我们很熟悉,一幅图像是由三个独立的红,蓝,绿通道构成,每个值代表每个像素的每个分量的度量值,如果值越高也就越亮。

因为人眼也是由三种感光细胞构成,因此RGB我们是最熟悉的,比如在电竞的时候,使用RGB灯可以刺激人的感官,提升成绩。

上图也就是RGB的实现方式。

二:灰度

灰度图像我们的应用也是非常广泛,包括我们后续的如果做视频追踪也都是将彩色视频逐帧转换为灰度图像再去定位,不过这是后话。

彩色转换为灰度图像的计算方法如下:

每个像素值只表示灰度信息这一单一信息

RGB[A]准换成灰度:Y=0.299R+0.587G+0.114*B

灰度转换为RGB[A]:R=Y,G=Y,B=Y,A=max(ChannelRange)

在OpenCV中我们可以使用cvtColor函数来实现转换

结果如下:

三:HSV

HSV颜色空间输入面向色度的颜色坐标系统的一种。这种类型的颜色模型接近人类颜色感知的仿真模型。

HSV的三个通道表示色度(H给出的颜色光谱构成的一种度量),饱和度(S给出主波长中的纯光比例,这表明一种颜色距离相同亮度灰度的程度)和纯度(V给出相对于白色光照强度的亮度),对应于直觉上的色彩、明暗和色调。HSV广泛应用于色彩的比较.

关于HSV的计算可以参考以下的公式:

这里我们用OpenCV实现:

得到的结果如下:

这样来看,似乎什么信息都没有,这里要注意一点,因为在代码中显示函数使用的是imshow(),这个函数是以RGB来显示的,因此我们使用HSV肯定是不正确的,如果想显示正确,必须要将其转换成RGB空间,这个具体以后再详细说一下。

四:YCRCB

该空间广泛用于视频和图像压缩,不能算作纯粹的色彩空间,它是RGB颜色空间的一种解码方式Y通道表示亮度,而Cr和Cb表示红色差值(在RGB空间中R通道和Y的差值)和蓝色差值(在RGB空间中B通道和Y的差值)各自的色度分量。

其变化的计算如下:

在OpenCV中,我们使用:

得到的结果如下:

总体来看,还是可以看得出相对于其他的色彩模型,还是能够保留一定的色彩,但是因为压缩的缘故,色彩空间还是差很多。

完整的代码如下,希望大家可以多多动手,亲身尝试一下。

import cv2 as cv
import numpy as np
#色彩空间转换函数:RGB,HSV,YUV重要
def color_space_demo(image):
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    cv.imshow("gray",gray)
    hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV)
    cv.imshow("HSV",hsv)
    yuv = cv.cvtColor(image,cv.COLOR_BGR2YUV)
    cv.imshow("YUV",yuv)
    Ycrcb = cv.cvtColor(image,cv.COLOR_BGR2YCrCb)
    cv.imshow("YCRCB",Ycrcb)


#imread函数用来读取图片
src = cv.imread("D:/1.png")
#namedWindow函数用来指定输出图片的尺寸和窗口大小,autosize是自动大小
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
#imshow函数用来显示图像
cv.imshow("input image",src)
color_space_demo(src)
#等待键盘触发,否则一直在此窗口等待
cv.waitKey(0)
#结束所有的窗口
cv.destroyAllWindows()

而下一篇文章,我们将会通过一段视频,来通过HSV来过滤出特定的颜色空间,这也是很有意义的一项工作。并且在实际生活中很有用,如果大家遇见什么问题,也请多多和我交流。


每天进步一丢丢

设计自组织映射神经网络并设定网络训练参数——初始化权值 & 设计拓扑领域

初始化权值:可以随机初始化,但尽量使权值的初始位置与输入样本的大概分布区域充分重合,避免出现大量的初始“死节点”。一种简单易行的方法是从训练集中随机抽取m个输入样本作为初始权值。 设计拓扑领域:拓扑领域的设计原则是使领域不断缩小,这样输出平面上相邻神经元对应的权向量之间既有区别又有相当的相似性,从而保证当获胜节点对某一类模式产生最大响应时,其领域节点也能产生较大响应。领域的形状可以是正方形、六边形或者菱形。优势领域的大小用领域的半径表示,通常凭借经验来选择。

预告:设计自组织映射神经网络并设定网络训练参数——设计学习率