图像像素在内存中的保存方式

像素值以 矩阵方式 保存,矩阵的大小取决于图像采用的颜色模型。

如果是灰度图,那么图像就是单通道的,图像中的每个像素只需要一个矩阵元素来保存,一般就是 0~255 的值。

保存灰度图的矩阵长这样:

其中 Row0 和 Column0 的交点上的元素值就代表了图像上对应位置的像素的灰度值。

如果是彩色图,那么图像就是多通道的,一个像素需要多个矩阵元素来保存,矩阵中的列会包含多个子列,且子列数和通道数相等。

保存 RGB 图像的矩阵长这样:

图像存储为矩阵

看看一个三通道的彩色图像是怎么组织为矩阵形式的。

原图:

注:opencv 里图像的存储为 BGR 格式,刚好和现在流行的 RGB 反过来了。

看一下图像的 shape 和矩阵存储形式:

import cv2
import numpy as npimg = cv2.imread('Touka.jpg')
cv2.imshow('src', img)  # src为标题,表示原图
print(img.shape)
print(img.size)
print(img.dtype)
print(img)
cv2.waitKey()
# img.shape
(1080, 1920, 3)
# img.size
6220800
# img.dtype
uint8
# img
[[[255 255 255][255 255 255][255 255 255]...[199 185 251][205 186 255][209 187 255]][[255 255 255][255 255 255][255 255 255]...[190 179 251][190 177 251][192 177 251]][[255 255 255][255 255 255][255 255 255]...[179 177 253][174 171 250][174 169 248]]...[[255 255 255][255 255 255][255 255 255]...[255 255 255][255 255 255][255 255 255]][[255 255 255][255 255 255][255 255 255]...[255 255 255][255 255 255][255 255 255]][[255 255 255][255 255 255][255 255 255]...[255 255 255][255 255 255][255 255 255]]]
  1. 输出是 三维矩阵,这个判断比较简单,从第一个 “[” 开始数,直到第一个 “]” 时,有几个 “[” 就是几维的,这和输出的 img.shape 也肯定是对应的。
  2. 输出的图像 shape 为 H * W * 3,即 高度 * 宽度 * 3通道 或者 行数 * 列数 * 3通道。
  3. 图像的 shape 为 (1080, 1920, 3),第一维 1080 表示有 1080 行,所以有 1080 个小的二维矩阵,每个二维矩阵是三通道图像中的一行。
  4. 在每一个小矩阵中,有 1920 行,每一行有 3 列,每一行的三个像素值就对应当前位置的 B G R 三个通道。这列能够看出,虽然按照行来分块,但实际上列方向才是位置上相邻的像素点。
  5. 再从通道的角度看,BGR 是三通道,第一整列对应的就是一幅图所有的 B 通道灰度值(更准确一些应该叫亮度值),第二、第三就分别是 G 和 R 通道对应的灰度值。下图只截取了一部分,知道什么意思就行。

分别输出 B G R 三个通道看看:

import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib qt5img = cv2.imread('Touka.jpg')
channels = ["B", "G", "R"] # 注意通道顺序for i in range(3):print("channel: " + channels[i])print(img[:,:,i])plt.subplot(1, 3, i+1)plt.imshow(img[:,:,i], cmap=plt.cm.gray)plt.title(channels[i])print(img[:,:,0].shape)
plt.show()
# 输出
channel: B
[[255 255 255 ... 199 205 209][255 255 255 ... 190 190 192][255 255 255 ... 179 174 174]...[255 255 255 ... 255 255 255][255 255 255 ... 255 255 255][255 255 255 ... 255 255 255]]
channel: G
[[255 255 255 ... 185 186 187][255 255 255 ... 179 177 177][255 255 255 ... 177 171 169]...[255 255 255 ... 255 255 255][255 255 255 ... 255 255 255][255 255 255 ... 255 255 255]]
channel: R
[[255 255 255 ... 251 255 255][255 255 255 ... 251 251 251][255 255 255 ... 253 250 248]...[255 255 255 ... 255 255 255][255 255 255 ... 255 255 255][255 255 255 ... 255 255 255]]# shape
(1080, 1920)

要知道将 RGB 图像拆开,每个通道单独拿出来都是一个与原图大小相同的灰度图,灰度图中像素的灰度值越大,该像素的颜色就越浅,灰度值越小颜色就越深。

注意这里的深和浅说的是灰度图中的像素,和彩色图没有关系,当要显示彩色图像时,将 R G B 三个分量分别放入红色、绿色和蓝色通道里,经过处理后就得到了彩色图像。

所以我们想要什么颜色深一些,只需要将它对应的灰度图中的灰度值设置大一些就好了。

对于一张彩色图中越红的部分,在它的 R 通道灰度图上对应区域的像素灰度值越大,灰度图像素的颜色越浅。下面第 3 张是 R 分量的灰度图,可以观察到在原图中越红的部分在这张灰度图中的颜色就越浅,因为灰度值大。

其实 R G B 三个通道的灰度图和颜色没有关系,如果愿意它们还可以随便定义为红橙黄绿青蓝紫…

交换一下 R 和 B 通道,也就是把 R 分量送给蓝色通道,把 B 分量送给红色通道,就得到下面的结果:

这样就能看出,其实 B G R 三通道灰度图与颜色没有关系,它们相当于”颜料“,想要蓝色多一些就加”颜料“,也就是把蓝色对应的灰度图的灰度值调大,上面将灰度值较大的 R 通道灰度图送给蓝色,所以原来是红色的部分自然就是蓝色了。

参考:
图像就是矩阵
OpenCV(三) 关于图片的存储
RGB图像之灰度级和通道的理解

关于三通道彩色图像的存储方式理解相关推荐

  1. 浮点数存储方式理解,浮点数和整数之间的转换

    目录 一:单精度和双精度浮点数存储格式: 二:浮点数转换成二进制表示 I:整数部分转换二进制的方法: II:小数部分转换二进制的方法: 一:单精度和双精度浮点数存储格式: 按IEEE754标准,32位 ...

  2. GoAccess 支持三种类型的存储方式。请根据你的需要和系统环境进行选择

    默认哈希表 内存哈希表可以提供较好的性能,缺点是数据集的大小受限于物理内存的大小.GoAccess 默认使用内存哈希表.如果你的内存可以装下你的数据集,那么这种模式的表现非常棒.此模式具有非常好的内存 ...

  3. C语言之局部变量全局变量变量存储方式

    备注:1.文章中的例子暂时为空,日后希望自己能自己编写例子赋贴上来. 一.角度分析: 变量作用域 -------> 局部变量和全局变量 变量存在的生存期 ---------> 静态存储方式 ...

  4. python将四通道图片转为三通道图片

    问题: 在做实验的时候,使用的数据集是tif格式的图片(png图片格式也可以是四通道),由于是四通道的图片在使用 plt.imshow(img) 时发现无法绘制出图片,因此试着输出图片的shape,才 ...

  5. 什么是数据结构以及数据结构的存储方式、逻辑结构和存储结构的关系、数据结构的运算、逻辑结构的四种基本类型

    一.什么是数据结构 1.数据结构的起源         数据结构不是研究数值计算的这些是数学家应该研究的问题,它是研究计算机存储.组织数据的方式问题的学科,数据结构会影响算法的效率,合适的数据结构可以 ...

  6. 一篇文章看懂三种存储方式DAS、NAS、SAN

    一.DAS.NAS.SAN在存储领域的位置 随着主机.磁盘.网络等技术的发展,数据存储的方式和架构也在一直不停改变,本文主要介绍目前主流的存储架构. 根据服务器类型分为: 封闭系统的存储(封闭系统主要 ...

  7. 【计算机图形学】RGB图像在计算机中存储方式的理解——图形学基础

    最近在学习计算机图形学方面的课程,主要是使用opencv来处理图像,这里涉及到了图像存储的方式,方便后续对图像通道分离处理还有滤波的理解. RGB色彩模式也就是红(Red).绿(Green).蓝(Bl ...

  8. DAS、SAN和NAS三种服务器存储方式

    一.存储的分类 根据服务器类型分为:封闭系统的存储和开放系统的存储, 内置存储 外挂存储  外挂存储根据连接的方式分为: 网络接入存储(Network-Attached Storage,简称NAS) ...

  9. 彩色图像RGB三通道问题探究

    之前做图像问题研究时经常会提到RGB通道,这次做一个小研究,对最底层的东西深究一二-- 直接上全部代码吧,一点点来: # -*- coding: utf-8 -*- import cv2 img=cv ...

最新文章

  1. java thumbnailator 做图片处理
  2. 解决数据库里表字段带下划线,实体类转小驼峰,Mapper的映射问题
  3. Maven私服安装及配置——(十二)
  4. Image Processing Wavefronts for HEVC Parallelism
  5. python random 之基础点名器
  6. FastJSON 简介及其Map/JSON/String 互转
  7. 智慧水务项目建设方案
  8. 西门子1200PLC的OB块用法讲解
  9. 小米浏览器 解析html5,JavaScript - 判断当前用户使用的浏览器
  10. 程序员必备75道逻辑思维题(附答案)之二
  11. 从 0 基础到 10w 册数据分析书籍的畅销书作家
  12. Cortex-M0芯片GPIO详解
  13. 教师继续教育 计算机知识,教师继续教育管理制度
  14. gradle打包报错Using insecure protocols with repositories...
  15. mysql 列连接_计数mysql中的连接列
  16. 解决LaTeX:!Package CJK Error:Invalid character code报错
  17. 21、ESP12E Motor Shield 电机驱动板使用
  18. 阿里面试之Hr面,这个套路把我坑惨了......
  19. MySQL插入表格数据的时候出现1265错误
  20. 「题解」300iq Contest 2 B Bitwise Xor

热门文章

  1. bzoj1787.紧急集合(倍增LCA)
  2. 爬虫常用数据提取方式:正则、xpath、beautifulsoup
  3. SQL数据库系统概论
  4. hadoop查看文件总条数及按某个关键词查询
  5. 用在生产中的裸金属Ironic
  6. 让流媒体服务SRS支持P2P通信
  7. 如何使用 FFmpeg 进行图片压缩与制作视频酷游连结
  8. 大专自学python找工作_大专生自学Python到找到工作的经历
  9. 云服务器怎么安装虚拟显卡,云服务器怎么弄图形界面
  10. Hadoop安全之Kerberos