RGB 与 BGR 颜色深度、像素和字节之间的关系

这篇具有很好参考价值的文章主要介绍了RGB 与 BGR 颜色深度、像素和字节之间的关系。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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)对图像文件使用不同的默认解码方法,这可能导致图像被解释为BGRRGB

使用 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)
RGB 与 BGR  颜色深度、像素和字节之间的关系

使用 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);
RGB 与 BGR  颜色深度、像素和字节之间的关系
将 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');
RGB 与 BGR  颜色深度、像素和字节之间的关系
分别查看具有不同色调的 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] = 1
    img1 = rgb_data*arr
    plt.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')
RGB 与 BGR  颜色深度、像素和字节之间的关系

使用 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);
RGB 与 BGR  颜色深度、像素和字节之间的关系

你将通过以下代码片段在 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')
RGB 与 BGR  颜色深度、像素和字节之间的关系

如果图像具有 1 个颜色通道(灰度)和 2 位颜色深度,则 1 个像素将为 2/8 字节或 0.25 字节:

# 1 channel 2-bit-color-depth --> 4 color combinations

scaled_image = (gray_img_by_cv2/64).astype(np.uint8)
plt.imshow(scaled_image, cmap='gray');
RGB 与 BGR  颜色深度、像素和字节之间的关系

如果图像具有 1 个颜色通道(灰度)和 3 位颜色深度,则 1 个像素将为 3/8 字节或 0.375 字节:

# 1 channel and 3-bit-color-depth --> 8 color combinations

scaled_image = (gray_img_by_cv2/32).astype(np.uint8)
plt.imshow(scaled_image, cmap='gray');
RGB 与 BGR  颜色深度、像素和字节之间的关系

如果图像具有 1 个颜色通道(灰度)和 4 位颜色深度,则 1 个像素将为 4/8 字节或 0.5 字节:

# 1 channel 4-bit-color-depth --> 16 color combinations

scaled_image = (gray_img_by_cv2/16).astype(np.uint8)
plt.imshow(scaled_image, cmap='gray');
RGB 与 BGR  颜色深度、像素和字节之间的关系

如果图像具有 1 个颜色通道(灰度)和 8 位颜色深度,则 1 个像素将是 8/8 字节或 1 个字节:

# 8bit color depth and 1 channel --> 256 color combinations

scaled_image = (gray_img_by_cv2).astype(np.uint8)
plt.imshow(scaled_image, cmap='gray');
RGB 与 BGR  颜色深度、像素和字节之间的关系

如果图像有 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);
RGB 与 BGR  颜色深度、像素和字节之间的关系

如果图像有 3 个颜色通道,并且每个通道的每个通道都是 8 位颜色深度,那么 1 个像素将是 24/8 字节或 3 个字节:每个通道 1 个像素。

通常,图像有 3 个颜色通道,每个通道都是 8 位颜色深度,称为 24 位颜色(或真彩色)图像:

# 3 channel and 8-bit-color-depth --> 16777216 color combinations
# 256*256*256 = 16777216

scaled_image = (rgb_img_by_cv2).astype(np.uint8)
plt.imshow(scaled_image, cmap='gray');
RGB 与 BGR  颜色深度、像素和字节之间的关系

重要的!然而,当我们使用扩展名(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」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓文章来源地址https://www.toymoban.com/news/detail-473131.html

到了这里,关于RGB 与 BGR 颜色深度、像素和字节之间的关系的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MATLAB中颜色模型介绍级各模型之间转换(RGB、HSV、NTSC、YCbCr、HSI)

    1.颜色模型定义 2.各颜色模型简介 3.颜色模型的转换 颜色模型 :某个三维颜色空间中的一个可见光子集,它包含某个颜色域的所有颜色。例如,RGB颜色模型就是三维直角坐标颜色系统的一个单位正方体。颜色模型的用途是在某个颜色域内方便地指定颜色。由于每一个颜色域都

    2024年02月06日
    浏览(76)
  • DiffMatch:扩散模型 + 图像配对 + 密集匹配,如何在一对图像之间建立像素级的对应关系?

      论文地址:https://arxiv.org/pdf/2305.19094.pdf 代码地址:https://ku-cvlab.github.io/DiffMatch/   在做一个项目,需要俩张配对图像相互转换的算法。 用 pix2pix(GAN)的效果不好。 因为 扩散模型 比 GAN模型 生成要好,那得找 扩散模型 + 配对算法,这就是 DiffMatch。 图像转换、密集对应差

    2024年01月20日
    浏览(91)
  • 【超直白讲解opencv RGB与BGR】RGB模式与BGR模式有什么不同,如何相互转换?

    一、为什么会有BGR和RGB两种通道? 首先RGB与BGR本质都没有什么区别,OpenCV和PIL读取图片的格式分别是BGR和RGB。 当我们使用OpenCV读取图像时,你应该也会发现读取的数组其实是 BGR 格式,而不是我们听得最多、用得最多的 RGB 格式。那为什么要用BGR通道而不用RGB通道来描述图像

    2024年02月01日
    浏览(41)
  • OpenCV 实现BGR转RGB

    当使用opencv函数imread()读取图片时,颜色的顺序是BGR(blue、green、red),而Pillow的颜色顺序又是RGB,因此我们可能需要将BGR转RGB。 可以通过以下几种方法实现BGR转RGB 本文福利, 莬 费领取Qt开发学习资料包、技术视频,内容包括(Qt实战项目,C++语言基础,C++设计模式,Qt编程入

    2024年02月07日
    浏览(43)
  • cv2 保存图片RGB BGR

    原图: cv2.imrite之后的图: 可以看到前后图片一样,我们都知道cv2 .imread读取进来的图像是BGR格式,而cv2.imrite保存的时候也需要BGR格式,这样保证颜色通道顺序一致。 通常情况下,我们都需要转换成RGB的格式进行后续处理,看下面的例子 而保存的图像却是: 可以看到颜色前

    2024年02月12日
    浏览(50)
  • BMP图片读写实践:rgb转bgr

    本实理论上支持24位图和32位图,实际上只测试了24位。原理很简单,就是RGB中的蓝色字节和红色字节交换。 调试信息: 测试结果: 左边是转换之前,右边是转换之后。   由调试信息可知,选取的图片是720X336,也就是行4字节对齐的。换成721X336的图片,测试结果如下:果然出

    2024年02月11日
    浏览(51)
  • 【Python OpenCV格式转换:RGB与BGR互转】

    【Python OpenCV格式转换:RGB与BGR互转】 图像处理中颜色空间的转换是一个重要的问题。其中,RGB与BGR是最常见的两种格式,而OpenCV是最流行的图像处理库之一。在OpenCV中,我们可以轻松地将RGB和BGR格式之间进行转换。 下面是如何使用Python OpenCV将RGB格式转换为BGR格式的代码示例

    2024年02月13日
    浏览(47)
  • 【Intel Realsense D435】16位深度图和RGB颜色图的视频显示、录制和保存(Python)

    文章可以转载,但是必须表明出处! 本文使用Intel Realsense D435深度相机,拍摄RGB颜色图及16位深度图。 同时实现了以深度图和RGB颜色图为图像帧的视频显示、录制与保存。 以下为总体程序: 程序阅读如下: 1.库引用 2.相机初始化函数 3.图像流获取函数  4.相机功能释放函数

    2024年02月12日
    浏览(48)
  • 将一张RGB图像转换为BGR格式可以通过以下步骤实现

    读取图像:使用图像处理库(如OpenCV)读取一张RGB格式的图像,并将其存储为NumPy数组。 转换通道顺序:使用np.transpose函数将图像数组的通道顺序从RGB转换为BGR。 在这里,np.transpose函数的第一个参数是图像数组,第二个参数是元组,表示要交换的维度顺序。由于RGB格式的图像

    2024年02月11日
    浏览(67)
  • 模型权重和深度学习训练框架之间的关系

    通常我们可以看到有Caffe或Pytorch或TensorFlow的模型参数文件 不同的团队可能会使用不同的深度学习训练框架, 然后使用其 内部的模型权重保存函数 进行保存, 以便之后 自己的复用 或 发布开源 , 让别人使用自己已经训练好的模型权重, 在其基础上进一步做改进或训练 那么该团

    2024年02月11日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包