003:如何理解 CNN 中的 RGB 图像和通道?

ops/2024/12/29 2:45:17/

本文为合集收录,欢迎查看合集/专栏链接进行全部合集的系统学习。

合集完整版请参考这里。

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

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

通道

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

举个例子:在很多时候,对AI神经网络中的一些算法做工程化实现,或者做性能优化,除了关注算法本身之外,还会关注数据存储格式。一般在 pytorch 中(一个AI模型框架),数据的存储格式 NCHW, C指代的就是通道(channel), 如此一来,对于需要在通道维度做归一化(如 reduce)的算法,是很不友好的。

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

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

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

先看下 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 通道没有的红色特征。


http://www.ppmy.cn/ops/145804.html

相关文章

《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》学习笔记——HarmonyOS技术理念

1.2 技术理念 在万物智联时代重要机遇期,HarmonyOS结合移动生态发展的趋势,提出了三大技术理念(如下图3-1所示):一次开发,多端部署;可分可合,自由流转;统一生态&#xf…

第52天小迪安全(暴力破解)

目录 思维带图 前言: 学习 思路: mysql数据库默认root用户不允许外联 然后linux系统连的是ssh协议 windows系统连的是rdp协议验证码识别插件,识别率低,原因懒总结,需要自己输入密码的,都可以尝试暴力破…

Berlandesk 注册系统算法实现与解析

一、引言 在不久的将来,一款名为 “Berlandesk” 的电子邮件服务将在 Berland 地区开放,站点管理员希望尽快启动项目,其中很关键的一部分就是实现站点注册系统的原型。本文将详细介绍这个注册系统的功能要求以及使用 Python 语言实现的具体代…

建造者模式(Builder Pattern)

建造者模式(Builder Pattern) 建造者模式是一种 创建型设计模式,它将一个复杂对象的构造与它的表示分离,使得同样的构建过程可以创建不同的表示。 原理 核心思想:通过一步步的构建过程来创建复杂对象,而不…

Vue.js 高级组件开发:抽象与高性能架构

Vue.js 高级组件开发:抽象与高性能架构 引言一、动态组件与依赖注入1. 动态组件场景 二、高可扩展性的抽象组件模式1. 设计思路2. 案例:抽象数据表组件 三、复杂场景下的异步操作管理1. 使用 Vue Composition API 管理异步逻辑 四、渲染优化与框架底层钩…

@RequestBody与@ModelAttribute的区别

相同点 使用方式相同 使用后达到的效果相同 RequestBody 使用方式 PostMapping(value "/save") public void save(RequestBody User user) {} 达到效果:使用这个注解可以使用实体类接收前端传入的值。 ModelAttribute 使用方式 PostMapping(val…

Web防火墙和下一代防火墙的区别

介绍 客户经常询问“当我已经拥有下一代防火墙(NGFW)时,为什么需要Web应用程序防火墙(WAF)?”。本博文的目的是解释两种解决方案之间的区别,重点关注Web应用程序防火墙可以提供的附加值。 什么…

使用Kotlin开发Springboot项目

创建项目 选择kotlin 使用gradle 选择使用的库和Springboot版本 项目配置 和Java项目一致 项目结构 和Java项目也差不多 增删改查 先定义一个Mapper,使用Mapper,不需要进行其他配置,比如mapper路径等。 package com.example.demo.mapperimport co…