繁体   English   中英

OpenCV 的 BGR 和 PyPlot 的 RGB

[英]OpenCV's BGR and PyPlot's RGB

我了解到 OpenCV 颜色顺序是 BGR 而 Matpotlib 的 Pyplot 是 RGB。 所以我开始尝试使用这两个库来读取和显示图像。 这是我尝试过的图像: 在此处输入图像描述

它只是一个黑白图像,在某些部分带有红色。 现在,当我使用 pyplot.imshow() 显示 OpenCV 读取的图像副本时,领带和鞋子的颜色变为蓝色。 当我使用 cv2.imshow() 显示 pyplot.imread() 读取的图像副本时,也发生了同样的情况。 但是,当我使用 cv2.imshow() 显示由 cv2.imread() 读取的图像副本并使用 plt.imshow() 显示由 plt.imread() 读取的副本时,颜色保持不变。 我只是好奇,想知道执行此类操作时go在幕后的事情。 任何人都可以帮助我吗?

假设你有一个这样的向量: [0, 0, 255]

您知道有两种不同的颜色编码:RGB 和 BGR。 所以,在第一种情况下你有蓝色,在第二种情况下你有红色。

现在,让我们调用 RGB_Reader 和 BGR_Reader 两个系统来打开数字并显示它。

如果我用 BGR_Reader 打开图像,我有[0, 0, 255] 我将它传递给 RGB_Reader,仍然是[0, 0, 255] 我看到了蓝。 当我传递它时,我会传递[0, 0, 255] 我用 RGB_Reader 再次打开它,它又是蓝色的。

反过来也一样。

这对你有意义吗? 矢量不会改变,但它的解码方式会改变。

现在介绍另一个东西,叫做jpg_encoder。 那是告诉人们把蓝色、红色和绿色放在哪里,并且可能会重新排序。

这基本上取决于颜色约定。 OpenCV 遵循 BGR 约定,这意味着它将三元组(0, 150, 255)分别解释为 B、G 和 R 值。 所有其他库都遵循更明显的 RGB 约定。 OpenCV 遵循 BGR 约定的原因是我猜的遗留问题(可能是从 1991 年开始)。

我建议您仅使用 OpenCV 方法,例如cv2.imread()cv2.imshow()cv2.imwrite()等对图像执行任何操作。 因为以这种方式编写代码,您永远不必担心底层的 BGR 或 RGB 内容,一切都会正常工作。

当您想将 OpenCV 与 matplotlib 或枕头等一起使用时,就会出现问题。在这些情况下,您在将图像矩阵传递给相应的库时需要格外小心。 Since OpenCV holds the data in BGR format, while matplotlib or pillow would be expecting RGB format, so you explicitly need to convert the color order using cv2.cvtColor(img, cv2.COLOR_BGR2RGB) , or you may use numpy slicing as well to swap第一和第三通道也是如此。

您可以查阅此答案以获取将 OpenCV 图像转换为 PIL(另一个 python 图像处理模块)格式图像的演示代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM