嵌入式人工智能应用-第三章 opencv操作2

avatar
作者
筋斗云
阅读量:3

1 色彩空间与图像表示

1.1 背景介绍

色彩是人的眼睛对于不同频率的光线的不同感受,色彩既是客观存在的(不同频率的光)又是主观感
知的,有认识差异。所以人类对于色彩的认识经历了极为漫长的过程,直到近代才逐步完善起来,但至今,人类仍不能说对色彩完全了解并准确表述了,许多概念不是那么容易理解。“色彩空间”一词源于西方的“Color Space”,又称作“色域”,色彩学中,人们建立了多种色彩模型,以一维、二维、三维甚至四维空间坐标来表示某一色彩,这种坐标系统所能定义的色彩范围即色彩空间。我们经常用到的色彩空间主要有 RGB、CMYK、Lab 等。

1.1.1 RGB

RGB 色彩模式是工业界的一种颜色标准,是通过对红®、绿(G)、蓝(B)三个颜色通道的变化以及它们
相互之间的叠加来得到各式各样的颜色的,RGB 即是代表红、绿、蓝三个通道的颜色。RGB 是opencv 图像加载时默认的色彩空间。默认的图像通道顺序为 BGR。
在这里插入图片描述
色彩混合的基本定律表明:自然界任何一种色彩均可用红、绿、蓝三种原色光混合产生,这在几何上
能够以 R、G、B 三个互相垂直的轴所构成的空间坐标系统来表示,称为 RGB 色彩空间。如图 2.3.2 所示,RGB 色系坐标中三维空间的三个轴分别于红、绿、蓝三基色相对应,原点对应黑色,离原点最远的顶点对应白色,而立方体内其余各点对应不同的颜色。RGB 色彩系统用 R、G、B 三原色通过不同比例的混合来表示任一种色彩,因而它不能直观地度量色调、饱和度和亮度。而且,各分量之间存在着一定的相关性,它们在大多数情况下都是成正比的,主要表现为自然场景中若某一通道大,则像素的其他通道值也较大。
这意味着,如果要对图像的色彩进行处理,常常需要对像素的三个分量同时进行修改才不会影响图像的真实感,这将大大增加颜色调整过程的复杂性。因此,在 RGB 色彩空间下进行色彩迁移会比较复杂,得到的视觉效果也不自然。
在这里插入图片描述

1.1.2 YUV

在现代彩色电视系统中,通常采用三管彩色摄影机或彩色 CCD 摄影机进行取像,然后把取得的彩色
图像信号经分色、分别放大校正后得到 RGB,再经过矩阵变换电路得到亮度信号 Y 和两个色差信号 B-Y(即 U)、R-Y(即 V),最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去。这种色彩的表示方法就是所谓的 YUV 色彩空间表示。采用 YUV 色彩空间的重要性是它的亮度信号 Y 和色度信号 U、V 是分离的,便于对亮度和色彩分别进行处理。
YUV 与 YCrCb 的区别:YCrCb 颜色空是由 YUV 颜色空间派生的一种颜色空间。YCbCr 是在世界数
字组织视频标准研制过程中作为 ITU-R BT.601 建议的一部分,其实是 YUV 经过缩放和偏移的翻版。YCrCb 中的 Y 与 YUV 中的 Y 含义一致,Cb、Cr 同样都指色彩,只是在表示方法上不同。YCbCr 中,Y 是指亮度分量,Cb 指蓝色色度分量,而 Cr 指红色色度分量。在 YUV 家族中,YCbCr 是在计算机系统中应用最多的成员,其应用领域很广泛,JPEG、MPEG 均采用此格式。一般人们所讲的 YUV 大多是指 YCbCr。上面我们提到的 Camera 驱动、应用开发会遇到 RGB565 转 RGB888 等情况,其实更多的还是 YUV 与 RGB 的转换,下面是 YUV 与 RGB 的互换公式:

Y = 0.299R + 0.587G+ 0.114B U = -0.147R -0.289G + 0.436B V = 0.615R - 0.515G- 0.100B -------------------------------------------------------- R = Y + 1.14V G = Y - 0.39U -0.58V B = Y + 2.03U 

YUV 主要采样格式: YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1 和 YCbCr 4:4:4。
(1)、YUV 4:4:4:无压缩,YUV 三个信道的抽样率相同,因此在生成的图像里,每个象素的三个分
量信息完整(每个分量通常 8 比特),经过 8 比特量化之后,未经压缩的每个像素占用 3 个字节。

下面的四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3] 存放的码流为: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3 

(2)、YUV 4:2:2:压缩 33.3%,每个色差信道的抽样率是亮度信道的一半,所以水平方向的色度抽样率
只是 4:4:4 的一半。对非压缩的 8 比特量化的图像来说,每个由两个水平方向相邻的像素组成的宏像素需要占用 4 字节内存。

下面的四个像素为:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3] 存放的码流为:   Y0 U0 Y1 V1 Y2U2 Y3 V3 映射出像素点为:[Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3] 

(3)、YUV 4:1:1: 压缩 50%,4:1:1 的色度抽样,是在水平方向上对色度进行 4:1 抽样。对于低端用户
和消费类产品这仍然是可以接受的。对非压缩的 8 比特量化的视频来说,每个由 4 个水平方向相邻的像素组成的宏像素需要占用 6 字节内存。
每个点保存一个 8bit 的亮度值(也就是 Y 值),每 2x2 个点保存一个 Cr 和 Cb 值,图像在肉眼中的感觉
不会起太大的变化。所以,原来用 RGB(R,G,B 都是 8bit unsigned)模型,1 个点需要 8x3=24bits,(全采样后,YUV 仍各占 8bit)。按 4:1:1 采样后,而现在平均仅需要 8+(8/4)+(8/4)=12bits(4 个点,8*4(Y)+8(U)+8(V)=48bits), 平均每个点占 12bits。这样就把图像的数据压缩了一半。

下面的四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3] 存放的码流为: Y0 U0 Y1 Y2 V2 Y3 映射出像素点为:[Y0 U0 V2] [Y1 U0 V2] [Y2 U0 V2] [Y3 U0 V2] 

(4)、YUV4:2:0: 压缩 50%,4:2:0 并不意味着只有 Y、Cb 而没有 Cr 分量。它指得是对每行扫描线来说,只有一种色度分量以 2:1 的抽样率存储。相邻的扫描行存储不同的色度分量,也就是说,如果一行是 4:2:0的话,下一行就是 4:0:2,再下一行是 4:2:0…以此类推。对每个色度分量来说,水平方向和竖直方向的抽样率都是 2:1,所以可以说色度的抽样率是 4:1。对非压缩的 8 比特量化的视频来说,每个由 2x2 个 2 行 2 列相邻的像素组成的宏像素需要占用 6 字节内存。绝大多数视频编解码器都采用这种格式作为标准的输入格式。

下面八个像素为:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]               [Y5 U5 V5] [Y6 U6 V6] [Y7 U7 V7] [Y8 U8 V8] 存放的码流为:  Y0 U0 Y1 Y2 U2 Y3 Y5 V5 Y6 Y7 V7 Y8 映射出的像素点为:[Y0 U0 V5] [Y1 U0 V5] [Y2 U2 V7] [Y3 U2 V7]                 [Y5 U0 V5] [Y6 U0 V5] [Y7 U2 V7] [Y8 U2 V7] 

1.1.3 HSV

RGB 是对机器很友好的色彩模式,但并不够人性化,因为我们对色彩的认识往往是”什么颜色?鲜艳
不鲜艳?亮还是暗?”。
HSV(Hue,Saturation,Value)是根据颜色的直观特性由 A.R.Smith 在 1978 年创建的一种颜色空间,也称六角锥体模型(Hexcone Model)。HSL 和 HSV(HSB) 都是基于 RGB 的,是作为一个更方便友好的方法创建出来的。HSB 为 色相,饱和度,明度;HSL 为 色相,饱和度,亮度,HSV 为色相,饱和度,明度。HSB 和 HSV 是一样的,只是叫法不同,HSL 则还有一些细微的区别:在所有的情况下,H(Hue) 代表色相,S(Saturation) 代表饱和度。Hue(色相)是指取值范围在 0-360°的圆心角,每个角度可以代表一种颜色。B 在 HSB 模式中是 Brightness 的意思, V 在 HSV 中是值,但是所表述的是一个东西:对光的量或光源的功率的感知。色相(H)和明度(值)(V/B)可以在 0-1 或者 0%-100%间取值。HSL 稍微有一些不同,Hue(色相)和 HSB/HSV 模式中一样用数值表示,但是,S,同样代表“饱和度”,定义不一样,且需要转换。L 代表亮度,和 Brightness/Value 不一样。Brightness(明度)是被认为是”光的量“,可以是任何颜色。而 Lightness(亮度)是作为”白的量“来理解的。

2 实验步骤

2.1 彩色图像变成灰度图像

coding: utf-8

import cv2 import numpy as np def rgb2gray_mean(img): ratio = 1.0 / 3 int_img = img.astype(np.int32) result = ratio * (int_img[...,0]+int_img[...,1]+int_img[...,2]) return result.astype(np.uint8) def main(): color = cv2.imread('./cyq.jpg') gray = rgb2gray_mean(color) cv2.imshow('color', color) cv2.imshow('gray', gray) cv2.waitKey(0) if __name__ == '__main__': main() 

2.2 RGB TO HSV

import cv2 import numpy as np def main(): color = cv2.imread('./cyq.jpg') hsv = cv2.cvtColor(color,cv2.COLOR_BGR2HSV) hsvChannels = cv2.split(hsv) cv2.imshow("Hue",hsvChannels[0]) cv2.imshow("Saturation",hsvChannels[1]) cv2.imshow("Value",hsvChannels[2]) cv2.imshow('color', color) cv2.waitKey(0) if __name__ == '__main__': main() 

HSV 各个分量的差别是很大的,这对于人类来说可能不太好看,但对颜色空间的图像进行有效地处理都是在 HSV 空间进行的。对于基本色中对应的 HSV 分量需要给定一个严格的范围,下面是通过实验计算的模糊范围。
在这里插入图片描述
在这里插入图片描述
就可以对原始图像进行分析处理,例如巡线、颜色识别,车辆识别等,可以根据特定的目标进行检测。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!