【超直白讲解opencv RGB与BGR】RGB模式与BGR模式有什么不同,如何相互转换?

这篇具有很好参考价值的文章主要介绍了【超直白讲解opencv RGB与BGR】RGB模式与BGR模式有什么不同,如何相互转换?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、为什么会有BGR和RGB两种通道?

首先RGB与BGR本质都没有什么区别,OpenCV和PIL读取图片的格式分别是BGR和RGB。

当我们使用OpenCV读取图像时,你应该也会发现读取的数组其实是BGR格式,而不是我们听得最多、用得最多的RGB格式。那为什么要用BGR通道而不用RGB通道来描述图像呢?

OpenCV默认通道为BGR,可能是基于某种硬件层面的原因。因为caffe,作为最早最流行的一批库的代表,用了opencv,而opencv默认通道是bgr的。这是opencv的入门大坑之一,bgr是个历史遗留问题,为了兼容早年的某些硬件,opencv也不好改回来了。其实你自己训练完全可以用rgb,新库也基本没了bgr还是rgb这个问题,就是切换下顺序。但如果你要用一些老的训练好的模型,就得兼容老模型的bgr。

【官网更详细解释】RGB是字节顺序。但是大多数vanilla图形库的有意实现选择是它们在内部将颜色视为无符号32位整数,其中三个(或四个,通常包括alpha)组件被打包到整数中。在小端机器(例如x86)上,整数0x01020304实际上将作为0x04030201存储在内存中。因此0x00BBGGRR将存储为0xRRGGBB00!所以术语BGR(和BGRA等)是一个漏洞抽象,其中图形库解释整数是如何按逻辑排序的,以便使直接访问颜色组件的代码更具可读性。请记住,位图通常由硬件的更多部分访问,而不是处理器,并且由传统显示适配器指定的字节序不一定与CPU的字节序相同。在操纵像素中的通道的级别上,CPU无论其顺序如何都可以提取字段;它纯粹是程序员理解标签的东西。

二、简单例子验证

让我们用OpenCV和PIL分别阅读并展示下面的图片,并比较结果:

cv2

import cv2
img_path = 'dataset1/train/ants_img/0013035.jpg'
img = cv2.imread(img_path)
print(img)

PIL

from PIL import Image
img_path = 'dataset1/train/ants_img/0013035.jpg'
img = Image.open(img_path)
img_arr = np.array(img)
print(img_arr)

结果如下:

                            bgr和rgb的区别,opencv,深度学习,人工智能              bgr和rgb的区别,opencv,深度学习,人工智能

简单点来说我们从第一个[]分析,可以看到一个是cv2 [233 151 80]与PIL [80 151 233] 正好分别对应了GBR与RGB。

由于二者的颜色通道不同,因此同一张图片显示的结果也应该不同,具体如下图所示

           bgr和rgb的区别,opencv,深度学习,人工智能    bgr和rgb的区别,opencv,深度学习,人工智能

三、如何将RGB与BGR进行转换

当执行 [:,:,::-1]后,数组会左右翻折,从而达到相互转换的效果,因此我们以cv2读取的图像进行实验,具体代码如下:

img_path = 'dataset1/train/ants_img/0013035.jpg'
img = cv2.imread(img_path)
img = img[:, :, ::-1]#BGR转为RGB
print(img)
plt.imshow(img)
plt.show()

 结果如下:

bgr和rgb的区别,opencv,深度学习,人工智能

 

bgr和rgb的区别,opencv,深度学习,人工智能

 最终发现,我们通过img[:, :, ::-1]果然实现了BGR转为RGB。

 四、备忘总结

以下是参考别人的比较好的总结,原文链接在下方

1、img = Image.open(ImgPath)
打开的图片是PIL类型,默认RGB。
将PIL类型转化为numpy类型:im = numpy.array(img)
才能看到shape属性,是(height, width, channel)数组,channel的通道数据是RGB。


2、cv2.imread(path, 读取方式):
path: 图片的路径;
读取方式: cv2.IMREAD_COLOR:读入一副彩色图片;cv2.IMREAD_GRAYSCALE:以灰度模式读入图片;cv2.IMREAD_UNCHANGED:读入一幅图片,并包括其alpha通道。
默认为cv2.IMREAD_COLOR。
返回值是(height,width,channel)数组,channel的顺序是BGR顺序


3、两者之间的相互转换
PIL Image转化为OpenCV格式:
img = Image.open()
img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
OpenCV转化为PIL Image格式:
img = cv2.imread()
img2 = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.imshow()和cv2.imshow()


4、这个显示是和读取对着的,也就是说要想可视化出来正常的RGB格式,给plt.imshow()的应该是rgb格式的图片,给cv2.imshow()的应该是bgr格式的图片。多说一些plt.imshow(),因为我平时几乎不用cv2.imshow()。在plt.imshow()中,接受的图片类型可以是np.ndarray,tensor, PIL Image这些任意的类型。
 

 

  参考网址:

​​​​​​【PyTorch】图像解析:RGB和BGR转换 - 知乎

【openCV中的BGR和RGB】img[:,:,::-1]和img[:, :, (2, 1, 0)]对图像操作文章来源地址https://www.toymoban.com/news/detail-790727.html

到了这里,关于【超直白讲解opencv RGB与BGR】RGB模式与BGR模式有什么不同,如何相互转换?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • OpenCV读取图像时按照BGR的顺序HWC排列,PyTorch按照RGB的顺序CHW排列

    在OpenCV中,读取的图片默认是HWC格式,即按照高度、宽度和通道数的顺序排列图像尺寸的格式。我们看最后一个维度是C,因此最小颗粒度是C。 例如,一张形状为256×256×3的RGB图像,在OpenCV中读取后的格式为[256, 256, 3],其中最后一个维度表示图像的通道数。在OpenCV中,可以通

    2024年02月04日
    浏览(37)
  • 【opencv&c++编译问题汇总】‘CV_BGR2RGB‘、 “CV_AA“、CV_WINDOW_NORMAL、CV_CAP 报错

    情景一 报错 error: use of undeclared identifier \\\'CV_BGR2RGB\\\' 解决:添加头文件如下 情景二 报错 E0020 未定义标识符 \\\"CV_AA\\\" 解决:添加头文件如下 情形三 CV_CAP 系列报错 解决:由于新版本的opencv标识符发生变化,这类统统去掉“CV_”即可,如下列所示 类似的,可调窗口命令标识符如若

    2024年02月06日
    浏览(46)
  • 在opencv中,RGB转gray,gray再转RGB,为何色彩不同?

    在将RGB图像转换为灰度图像时,颜色信息会丢失,因为灰度图像只包含亮度信息而不包含颜色信息。灰度图像的每个像素只有一个通道,表示亮度级别,而不是红、绿、蓝三个通道的组合。 当你将灰度图像再次转换回RGB图像时,OpenCV会将每个灰度像素值映射回RGB空间中。由于

    2024年02月15日
    浏览(28)
  • 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)
  • RGB 与 BGR 颜色深度、像素和字节之间的关系

    在处理图像时,了解 RGB 和 BGR 色彩空间之间的区别非常重要。RGB 和 BGR 都具有三个颜色通道:红色、绿色和蓝色。但是,这些通道在图像文件中的存储顺序可能不同。 RGB 通常用于图像编辑和显示应用程序,顺序为红色、绿色和蓝色。 BGR 通常用于图像处理应用程序,顺序为

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

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

    2024年02月11日
    浏览(67)
  • VMware设置静态ip地址及不同网络模式讲解【Linux网络问题】

    此处的静态IP配置选用的是使用NAT方式连接网络【如果之前配置有错误,可以尝试暴力方法:将虚拟机网络配置重新恢复为默认,然后从头开始配置】 1.查看VMware给Linux虚拟机分配的ip所在网段: (1)右键点击VMware中的【编辑】菜单栏,打开【虚拟网络编辑器】,然后选中【

    2024年02月01日
    浏览(52)
  • OpenCV将BGR转换为NV12

    NV12的格式为YYYYYYYY..UVUV..,OpenCV使用imread读出来的图像是BGR格式,但没有提供BGR直接转NV12的方法,只能先转成YUV_I420,再间接得到YUV_NV12。 可以使用如下代码将YUV_I420进行保存: 播放yuv图像,想得到正确结果,必须I420格式: 关于yuv的介绍可以参考这两篇文章: 作者简介 我是

    2024年02月16日
    浏览(49)
  • 如何将yuv420p图像数据转换为RGB数据并使用opencv保存为jpg图片

    yuv420是用4个byte存储4个Y的信息,用1个Byte存储U的信息,一个Byte存储V的信息, 这4个Y共用这2个U和V ,也就是用6个Byte 存储4个像素信息,也就是一个像素需要12个Bits(6*8/4),也就是12bpp。 注意yuv420p里面的p是指planar,也就是分层存储,先存全部Y的信息,然后是U的信息,最后

    2024年02月16日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包