AI 视觉连载3:RGB与通道

2、灰度与色彩的最后,给出了一个由彩色图片转成灰度图的示例,并且通过 color_image.mode获取了图片的格式:彩色图片获取到的格式为 RGBA,灰度图为 L。

这一节再介绍一下 RGB 图片以及通道的概念。

通道这个概念,在 深度学习 中很重要,并且极为重要。

举个例子------

在很多时候,对AI神经网络中的一些算法做工程化实现,或者做性能优化,除了关注算法本身之外,还会关注数据存储格式。

一般在 pytorch 中(一个AI模型框架),数据的存储格式 NCHW, C指代的就是通道(channel), 如此一来,对于需要在通道维度做归一化(如 reduce)的算法,是很不友好的。

因为数据在通道维度不连续,导致取到完整的通道维度信息要跨越很大的地址范围,CPU 或其他 xPU 对于这类的数据寻址性能都是很差的,至少要比连续寻址差。

此时就需要对通道维度做其他的变换。

以上举了在实际 AI 算法开发中会遇到的一类问题:通道维度数据在存储器中摆放不连续导致某些算法运算性能不好,这里暂时了解即可,无需深究,涉及到的内容会在专栏后面有详述。

本节的目的只有一个:只需要了解通道这个概念是什么就行了。

先看下 RGB 图像

你可能知道,色彩通常由红色(Red,R)、绿色(Green, G)、蓝色(Blue, B)三种基本颜色组成,这种颜色表示方式被称为彩色 RGB 模型。

在这个模型中,每个像素的颜色由这三种基本颜色组合而成。

因此,一个图像在二维平面上看似只有一个像素,实际是由三个不同颜色(不同通道)的像素混合组成。

这里的 R/G/B 三种颜色,就认为是彩色图片的三个通道,如下图所示。

(一张彩色RGB图片按照通道维度(C)堆叠)

来调一下颜色

通过调整红、绿、蓝三个通道的值,你可以混合出各种颜色。

和灰度图一样,在 RGB 模型中,每个通道的颜色也是用三个数值(0-255 范围内的整数)来表示,分别代表红、绿、蓝三个通道的强度。

你可以使用计算机的画图软件轻松的模拟调色的过程:例如,红色和绿色通道同时存在会产生黄色。

而红色和蓝色通道同时存在则会呈现洋红色。

如果3种颜色都有,则为白色。

RGB 分量

彩色图片有 RGB 三个通道,如果将三张分别为红色通道、绿色通道、蓝色通道的图片进行融合,那么就可以构成一幅色彩斑斓的图片。

同样的,也可以通过一定的方法,将三个通道的分量图像分别提取出来进行展示。

下图左侧是一张彩色原图,后面是分别提取的每个通道的分量绘制而成的图片:将原图的绿色/红色/蓝色通道分量都提取出来了。

RGB 图像在计算机中的占用大小

通常情况下,你可能会认为分辨率为 1920 x 1080 的图片,代表在图片的长、宽两个方向上有 1920 x 1080 个像素。

但是,在学习了本节的彩色 RGB 模型之后,你需要知道:一张彩色图像,除了长、宽方向之外还存在另外一个方向,那就是通道方向。

也就是说,彩色图像应该用三维数据来表示,而不是二维。

举个例子,一张 3 通道的 RGB 图像,长和宽分别为 1920 x 1280 个像素,需要表示该图像的形状为 1920 x 1280 x 3(或者用 [1920, 1280, 3] 的方式来表示)。

当然也可以表示为 3 x 1920 x 1280([3, 1920, 1280]) 来表示,这两种表示方法取决你把通道数放在长和宽的前面还是后面。

一张 1920 * 1280 的 RGB 图片, 在计算机存储时所需要的数据大小为------

1920 x 1280 x 3 x 1 Bytes = 7MB

也就是大约 7M 的数据量。

在实际存储时,受到图片压缩算法的影响,在计算机磁盘中看到的图片大小可能会小于这个数值,但是不影响通过这种方法来估算图片在计算机中的内存占用。

通道的意义

在后面深度学习章节中,我会经常提到通道的概念。

基于计算机视觉的 AI 神经网络在进行模型推理时,无论是卷积算法还是其他算法,计算的绝大部分是图像特征图中通道的关系。

特征图是一种神经网络中间层输出的图,其通道数有多有少,多则几千,少则几十。在特征图中,一个通道中的数据就可以粗略的认为代表了原始图像中的一个特征。

假设某一层特征图只有两个通道,那么将这两个通道的特征可视化之后,可能呈现出来的分别是"轮廓"特征,或者"嘴巴"的特征。

回到 RGB 的图像,因为 RGB 图像有 3 个通道,如果把彩色图片当做特征图的话,那就可以说 RGB 图片有 3 个特征通道。

每个通道或多或少的保留着原始图像的某些细节和轮廓特征,就像上面的三张分量图片一样,当然最主要的特征便是颜色:比如 R 通道,有着 B 通道没有的红色特征。

相关推荐
寻寻觅觅☆8 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
偷吃的耗子8 小时前
【CNN算法理解】:三、AlexNet 训练模块(附代码)
深度学习·算法·cnn
化学在逃硬闯CS9 小时前
Leetcode1382. 将二叉搜索树变平衡
数据结构·算法
ceclar1239 小时前
C++使用format
开发语言·c++·算法
Gofarlic_OMS10 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
夏鹏今天学习了吗10 小时前
【LeetCode热题100(100/100)】数据流的中位数
算法·leetcode·职场和发展
忙什么果11 小时前
上位机、下位机、FPGA、算法放在哪层合适?
算法·fpga开发
董董灿是个攻城狮11 小时前
AI 视觉连载4:YUV 的图像表示
算法
ArturiaZ12 小时前
【day24】
c++·算法·图论
大江东去浪淘尽千古风流人物12 小时前
【SLAM】Hydra-Foundations 层次化空间感知:机器人如何像人类一样理解3D环境
深度学习·算法·3d·机器人·概率论·slam