是否有任何理由将图像的通道顺序从 RGB 更改为 BGR?
Posted
技术标签:
【中文标题】是否有任何理由将图像的通道顺序从 RGB 更改为 BGR?【英文标题】:Is there any reason for changing the channels order of an image from RGB to BGR? 【发布时间】:2022-01-04 00:05:28 【问题描述】:我一直在关注this keras 视频分类教程,其中在data preparation 部分中,他们在load_video
函数中加载视频的帧非常通用,但引起我注意的是这行:
frame = frame[:, :, [2, 1, 0]]
这是我第一次遇到这种情况,大多数情况下您只会将帧“按原样”附加到您的帧列表中,但在这里它们会更改频道的顺序(如果我没记错的话)从 RGB 到 BGR,我在网络或他们的文档中找不到与它相关的任何内容,有人能给我一些关于这个决定的见解吗?
【问题讨论】:
如果你所做的一切都是连贯地使用渠道,那就没有问题了。即使在深度学习训练时使用交换的颜色平面也是无害的,因为系统永远不会知道颜色是不真实的。但是你需要保留交换! 【参考方案1】:根据经验,顺序可以更改的原因取决于您用于加载图像的框架。由于mostly historical reasons that are now outdated,OpenCV 特别以 BGR 格式对通道进行排序。正因为如此,我们不幸被这种设计选择所困扰。使用 scikit-image、matplotlib 和 Pillow 可以看到常规 RGB 格式的图像。
实际上,如果您查看load_video
函数,它使用 OpenCV 打开视频,因此传入的帧是 BGR 格式。因此,必须进行通道交换才能将其转换为 RGB 格式:
def load_video(path, max_frames=0):
cap = cv2.VideoCapture(path)
frames = []
try:
while True:
ret, frame = cap.read()
if not ret:
break
frame = crop_center(frame)
frame = frame[:, :, [2, 1, 0]]
frames.append(frame)
if len(frames) == max_frames:
break
finally:
cap.release()
return np.array(frames)
您当然不需要反转通道,因为神经网络会根据提供的输入数据进行学习,但人们倾向于这样做,以便轻松调试图像,而不必担心不断反转显示的通道。具体来说,如果一个神经网络是用 BGR 排序训练的,如果你以 RGB 格式加载图像,那么需要进行通道的反转,因为这就是图像通道在训练中的表示方式。总而言之,这取决于框架,但在使用经过训练的神经网络时,您需要牢记这一点。如果以 BGR 格式训练数据,如果以 RGB 格式读取图像,则需要在推理之前反转通道。
事实上,这是使用网络时的常见错误!非常勤奋,并在使用之前了解图像数据是如何为网络进行预处理的。
【讨论】:
想知道哪些优化需要 BGR 而不是 RGB?为什么 BGR 比 RGB 更好? @fmw42 好问题!这主要是出于历史原因。这是与相机制造商最兼容的格式,因此一旦加载数据,您无需进行任何额外的操作即可将其转换为我们最终熟悉的格式:learnopencv.com/why-does-opencv-use-bgr-color-format 顺便说一句,你让我头疼了,我打算使用一个预训练模型,该模型是在 coco 数据集上训练的,它需要 BGR 格式。 “与相机制造商兼容”的原因是一个误解。如果他们真的因为这个原因使用了 BGR,那真是太可悲了。 BRG 在 little-endian 机器中有意义,其中 RGB 三元组写为 R 在链接的博客文章中,“Windows,当使用 COLORREF 指定颜色值时,它们使用 BGR 格式 0x00bbggrr。” — Windows 一直在小中位数机器上使用,所以 0x00bbggrr 以“rrggbb00”或 RGB 的形式存储在内存中!以上是关于是否有任何理由将图像的通道顺序从 RGB 更改为 BGR?的主要内容,如果未能解决你的问题,请参考以下文章
PyTorch:将预训练模型从 3 个 RGB 通道更改为 4 个通道后,出现“ValueError:无法优化非叶张量”
java:BufferedImage判断图像通道顺序并转RGB/BGR