RGB 与 BGR 颜色深度、像素和字节之间的关系
在处理图像时,了解 RGB 和 BGR 色彩空间之间的区别非常重要。RGB 和 BGR 都具有三个颜色通道:红色、绿色和蓝色。但是,这些通道在图像文件中的存储顺序可能不同。
RGB 通常用于图像编辑和显示应用程序,顺序为红色、绿色和蓝色。
BGR 通常用于图像处理应用程序,顺序为蓝色、绿色和红色。
图像数据可以保存在不同的颜色空间(RGB、BGR、Gray等),不同的文件格式可以将图像保存在不同的颜色空间。这取决于图像处理库和软件在保存(或打开)图像时使用的颜色空间。
但是,将图像保存为文件格式时,通常的做法是将其保存在 RGB 颜色空间中。值得注意的是,当你以 BGR 顺序保存图像时,它仍然可以被大多数库和软件读取,但它们会将其视为 RGB 图像并以 RGB 格式显示。(你会看到交换了红色和蓝色通道的图像)
使用exiftool之类的工具查看图片的元数据,可能会得到这样的结果:
color mode: RGB
或者Color Space Data: RGB
这意味着一张图片有 3 个通道,但并不意味着 3 个颜色通道的顺序是red-green-blue,它也可能是blue-green-red。
读取和解释图像文件的程序决定了如何解释图像的颜色通道:不同的库(例如 OpenCV 和 PIL)对图像文件使用不同的默认解码方法,这可能导致图像被解释为BGR或RGB。
使用 Python 处理图像文件时,OpenCV 库(cv2)在读取图像时默认使用 BGR 颜色空间,而 PIL 库使用 RGB 颜色空间:
import cv2
from PIL import Image#reading an image using cv2.imread()
img_bgr = cv2.imread("image.jpg")#reading an image using plt.imread()
img_rgb = Image.open("image.jpg")
总而言之,当我们说 rgb 图像(有时称为真彩色图像)时,这意味着通过假设该图像的颜色通道顺序为红-绿-蓝来保存图像,而 bgr-image 则通过假设颜色顺序为蓝-绿-红。当我们打开该图像并通过某些软件或库进行绘图时,该软件或库将决定以 RGB 色彩空间还是 BGR 色彩空间显示图像。
使用 PIL 库打开 rgb 图像 :
import numpy as np
from PIL import Image, ImageOps
import matplotlib.pyplot as plt# Here we show rgb-image in RGB-color-space
rgb_img = Image.open("parrot-org.jpg")
plt.imshow(rgb_img)
使用 PIL 库打开 bgr 图像 :
BGR 不是实际的颜色空间,它只是图像的表示,其中颜色通道的顺序不同于传统的 RGB 表示。图像中像素的颜色值保持不变,但颜色通道的顺序交换了,第一个通道是蓝色,第二个通道是绿色,第三个通道是红色。
例如,[240,26,0]是左上角的像素值,当你通过 plt.imshow() 绘制图像时,你将在图像的左上角看到一个红点。因此,这意味着 plt.imshow() 使用了RGB-color-space,它确定了255表示红色,0表示绿色,0表示蓝色。然后像这样交换颜色通道:(1,2,3)-->(3,2,1)。
之后,左上角的像素值 ( [240, 26, 0]) 变为[0, 26, 240],然后你再次绘制它。现在你将在图像的左上角看到一个蓝点。因此,这意味着plt.imshow()使用了RGB 颜色空间,它确定0表示红色,0表示绿色,255表示蓝色。
这就是为什么你看到的是蓝点而不是红点。
基于此,我们可以说BGR颜色空间是RGB颜色空间中交换颜色通道的图像的表示。
# Here we show bgr-image in RGB-color-space
rgb_data = np.array(rgb_img)
bgr_data = rgb_data[:, :, ::-1] # (red,green,blue) --> (blue,green,red)
bgr_img = Image.fromarray(bgr_data)
plt.imshow(bgr_img);
将 3 通道图像转换为 1 通道图像
有多种方法可以将图像从 RGB 颜色空间转换为灰度,但最常用的方法之一是使用红色、绿色和蓝色值的加权平均值。该方法根据人眼对每种颜色的相对敏感度,为三个颜色通道分配不同的权重。
最常用的权重是:gray_weighted_average= 0.299 * R + 0.587 * G + 0.114 * B
另一种转换为灰度的方法是使用光度法,它根据人眼的光度函数分配不同的权重。这是将彩色图像转换为灰度图像的更准确方法:gray_luminosity = 0.2126 * R + 0.7152 * G + 0.0722 * B
OpenCV的
cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
采用加权平均法,Pil.ImageOps.grayscale(rgb_img)
采用光度法。
gray_img = ImageOps.grayscale(rgb_img)
plt.imshow(gray_img, cmap='gray');
分别查看具有不同色调的 3 个颜色通道
tint_names = ["red", "green", "blue"]plt.figure(figsize=(12,5))
for i in range(3):plt.subplot(1, 3, i+1)arr = np.zeros((3,), dtype='int')arr[i] = 1img1 = rgb_data*arrplt.title(f"channel={i+1} in #{tint_names[i]} tint")plt.imshow(img1) plt.figure(figsize=(12,5))
for i in range(3):plt.subplot(1, 3, i+1)img1 = rgb_data[:, :, i]plt.title(f"channel={i+1} in #grey tint")plt.imshow(img1, cmap='gray')
使用 OpenCV
RGB 图像——假设颜色通道的顺序是红-绿-蓝保存。
当你使用 opencv 读取 RGB 图像时 —>
cv2.imread()
读取 rgb 图像并通过交换颜色通道将其作为 bgr 图像返回在通过 opencv 读取 rgb 图像之后,如果你还使用 opencv 绘图 ->
cv2.imshow()
将在 BGR 颜色空间中绘制图像
因此,当你使用 opencv 打开 rgb 图像并使用 opencv 绘制它时,你将在 BGR 颜色空间中看到 bgr 图像,这看起来与 RGB 颜色空间中的 rgb 图像 相同。
import cv2# Here we see bgr-image in rgb-color-space
bgr_img_by_cv2 = cv2.imread(img_path)
plt.imshow(bgr_img_by_cv2);
你将通过以下代码片段在 BGR 颜色空间中看到 bgr 图像,并且弹出窗口显示图像(按ESC关闭它)
cv2.imshow("bgr-image in BGR-color-space", bgr_img_by_cv2)
cv2.waitKey(0)
cv2.destroyAllWindows()
通过颜色通道学习颜色深度并计算 1 个像素有多少字节
首先,阅读以下解释:https://www.quora.com/How-does-the-computer-memory-store-media-files/answer/Jabali-Searcot
如果图像具有 1 个颜色通道(灰度)和 1 位颜色深度,则 1 个像素将为 1/8 字节或 0.125 字节:
# 1 channel and 1-bit-color-depth --> 2 color combinations_, binary_image = cv2.threshold(gray_img_by_cv2, 128, 255, cv2.THRESH_BINARY)
plt.imshow(binary_image, cmap='gray')
如果图像具有 1 个颜色通道(灰度)和 2 位颜色深度,则 1 个像素将为 2/8 字节或 0.25 字节:
# 1 channel 2-bit-color-depth --> 4 color combinationsscaled_image = (gray_img_by_cv2/64).astype(np.uint8)
plt.imshow(scaled_image, cmap='gray');
如果图像具有 1 个颜色通道(灰度)和 3 位颜色深度,则 1 个像素将为 3/8 字节或 0.375 字节:
# 1 channel and 3-bit-color-depth --> 8 color combinationsscaled_image = (gray_img_by_cv2/32).astype(np.uint8)
plt.imshow(scaled_image, cmap='gray');
如果图像具有 1 个颜色通道(灰度)和 4 位颜色深度,则 1 个像素将为 4/8 字节或 0.5 字节:
# 1 channel 4-bit-color-depth --> 16 color combinationsscaled_image = (gray_img_by_cv2/16).astype(np.uint8)
plt.imshow(scaled_image, cmap='gray');
如果图像具有 1 个颜色通道(灰度)和 8 位颜色深度,则 1 个像素将是 8/8 字节或 1 个字节:
# 8bit color depth and 1 channel --> 256 color combinationsscaled_image = (gray_img_by_cv2).astype(np.uint8)
plt.imshow(scaled_image, cmap='gray');
如果图像有 3 个颜色通道和每个通道的 1 位颜色深度,则 1 个像素将为 3/8 字节或 0.375 字节:
# 3 channel and 1bit color depth --> 8 color combinations_, binary_image_from_rgb_img_by_cv2 = cv2.threshold(rgb_img_by_cv2, 128, 255, cv2.THRESH_BINARY)
plt.imshow(binary_image_from_rgb_img_by_cv2);
如果图像有 3 个颜色通道,并且每个通道的每个通道都是 8 位颜色深度,那么 1 个像素将是 24/8 字节或 3 个字节:每个通道 1 个像素。
通常,图像有 3 个颜色通道,每个通道都是 8 位颜色深度,称为 24 位颜色(或真彩色)图像:
# 3 channel and 8-bit-color-depth --> 16777216 color combinations
# 256*256*256 = 16777216scaled_image = (rgb_img_by_cv2).astype(np.uint8)
plt.imshow(scaled_image, cmap='gray');
重要的!然而,当我们使用扩展名(jpg/jpeg、png、tiff、bmp等)保存图像时,这些扩展名使用压缩算法将图像保存到内存中。这意味着24位彩色图像的1个像素将不会是3个字节,由于这些压缩算法,像素的大小将比3个字节小得多。
本文代码:https://github.com/zrruziev/deep_learning_practice/blob/main/TENSORFLOW/rgb-bgr-color_depth.ipynb
☆ END ☆
如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。
↓扫描二维码添加小编↓
RGB 与 BGR 颜色深度、像素和字节之间的关系相关推荐
- 摄像头的像素与分辨率之间的关系
最近在看摄像头的驱动, 一直没搞懂像素和分辨率之间的关系, 特收集来学习一下: 我们买数码相机或是评价相机功能的时候,常常提到相机的"像素"这一概念,认为像素大的相机就好,就能拍出 ...
- 浅谈汽车颜色与人的性格之间的关系
汽车颜色是汽车造型的元素之一,当车身内部乘坐环境及汽车外表与环境色彩达到协调,能给乘客及行人以美的感受.所以现在年轻人买车,高颜值的外观,汽车颜色都很重要.放眼望去白色车颇多,白色车也有缺点就是时间久 ...
- 关于字,半字,字节之间的关系
一直搞不清楚字,半字,字节之间的关系,查了一下资料,明白了. 字,半字,字节 大小是根据不同的操作系统来说的, 32位系统 字 ->32bit 半字 ->16bit 字节 ->8bi ...
- 像素与分辨率之间的关系
2019独角兽企业重金招聘Python工程师标准>>> 1.像素定义 构成影像的最小单位(就是一个小方点) 2.分辨率定义 单位长度内,像素的个数 例如以图片的像素是640×480, ...
- 人工智能、机器学习、深度学习及三者之间的关系
导读:什么是机器学习,什么是人工智能,什么是深度学习,这些名词概念我们一直有听说,但是也很容易混淆 这是小编的其他文章,希望对大家有所帮助,点击即可阅读 人工智能常用的十大算法 人工智能数学基础 ...
- 图片大小、像素、分辨率之间的关系
"像素"是相机感光器件上的感光最小单位.就像是光学相机的感光胶片的银粒一样,记忆在数码相机的"胶片"(存储卡)上的感光点就是像素:要想得到分辨率高(也就是细腻的 ...
- 像素与DPI之间的关系
先说像素.像素是电子图像组成的基本单位,将图像放大数倍,会发现图像是由一个个"小色块"紧密排列组成的,每一个"小色块"就是一个像素点. 也就是说,每个图像都是由 ...
- dpi和css,DPI和像素、厘米、英寸之间的关系和换算及CSS中的长度单位、位深度、ppi...
DPI和像素.厘米. 首先告诉大家一个不幸的消息:像素不能直接换算成英寸.厘米,要在dpi下才能换算! photoshop中两种分辨率换算 72像素/英寸=28.346像素/厘米 300像素/英寸=1 ...
- 深度学习和机器学习有什么关系?机器学习包含深度学习吗?
没有一种技术的发展是孤立的,有人在接触人工智能AI的时候,搞不清楚深度学习和机器学习之间的关系,机器学习包含深度学习吗?深度学习是机器学习的一部分吗?本文来解答一下此问题. 深度学习和机器学习有什么关 ...
最新文章
- TMB计算的小工具-calculate_TMB.exe
- Mysql进阶(1)——异步复制(主从复制、Gtid复制)、半同步复制
- 华为Mate 30系列发布:电影级4摄,麒麟990 5G,没谷歌全家桶,售价高于iPhone11
- linux用echo重定向到文件,Linux – Bash将String重定向到文件
- Java进阶:ArrayList线程安全问题和解决方案
- mariadb的explain分析及InnoDB存储引擎
- 视频检索扫盲 (一)
- python常用库有哪些餐厅_Python常用库整理
- 重写慢日志解析程序,实现打印慢SQL信息及其所属数据库
- java国际化软件_JavaWeb开发——软件国际化(动态元素国际化)
- RNN Attention
- 13.卷2(进程间通信)---Posix共享内存区
- 微信小程序——图片识别
- 小甲鱼python课后题共多少讲_小甲鱼Python第九讲课后习题--010列表
- VOIP技术连载之二--VOIP呼叫流程
- Android向系统日历添加日程提醒事件
- 2019八泉峡第二届国际露营大会圆满落幕 创新举措引爆景区
- jQuery Ajax异步请求详解
- 【C语言基础】C语言操作符
- 问题事件名称: APPCRASH 应用程序名: xxx.EXE 应用程序版本:
热门文章
- 看过来:种子轮…A轮?Pre-A?IPO?融资轮次,傻傻分不清楚
- JBoss的AS版本 Wildfly 介绍和使用
- 第5章 网站前台-活动与招聘
- 理解 Kafka 消费者属性的 enable.auto.commit
- MateRS能不能升级鸿蒙,华为MateRS只是开胃菜:麒麟980+1536G+5G芯片,网友:确实很吓人!...
- 基于Mtk平台的android camera hal3学习
- Camera2架构学习(二)——CameraServer和CameraProvider的启动初始化
- #ifdef__cplusplus 是什么意思?
- 将dae格式文件导入RViz中创建环境
- 一个免费开源、跨平台的可视化源码探索项目