是否有任何理由将图像的通道顺序从 RGB 更改为 BGR?

ImS*_*o3K 4 python opencv image-processing computer-vision keras

我一直在关注这个 keras视频分类教程,在数据准备部分,他们在函数中非常通用地加载视频帧load_video,但引起我注意的是这一行:

frame = frame[:, :, [2, 1, 0]]
Run Code Online (Sandbox Code Playgroud)

这是我第一次遇到这种情况,大多数时候您只是将帧“按原样”附加到帧列表中,但在这里它们将通道的顺序(如果我没记错的话)从 RGB 更改为BGR,我在网络或他们的文档中找不到任何与之相关的内容,有人可以给我一些关于这个决定的见解吗?

ray*_*ica 8

根据经验,顺序可以更改的原因取决于您用于加载图像的框架。OpenCV 特别以 BGR 格式对通道进行排序,因为主要是历史原因,但现在已经过时了。正因为如此,我们不幸地坚持了这种设计选择。常规 RGB 格式的图像可以使用 scikit-image、matplotlib 和 Pillow 来查看。

事实上,如果你看一下这个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)
Run Code Online (Sandbox Code Playgroud)

当然,您不需要反转通道,因为神经网络将根据提供的输入数据进行学习,但人们倾向于这样做,以便轻松调试图像,而不必担心不断反转通道展示。具体来说,如果神经网络按照 BGR 排序进行训练,如果您加载 RGB 格式的图像,则需要反转通道,因为这就是图像通道在训练中的表示方式。总而言之,这取决于框架,但在训练后使用神经网络时需要记住这一点。如果数据以 BGR 格式进行训练,如果您的图像以 RGB 格式读取,则需要在推理之前反转通道。

事实上,这是使用网络时常见的错误!在使用图像数据之前要非常勤奋并了解如何为网络对其进行预处理。

  • “与相机制造商兼容”的理由是一个误解。如果他们真的因为这个原因使用 BGR,那就太可悲了。BRG 在小端机器中有意义,其中写为 R<<16 + G<<8 + B 的 RGB 三元组以 BGR 顺序将值存储在 24 位字中。但话又说回来,你为什么要这样写三元组呢?我认为真正的原因与将一些旧代码从大端机器转换为小端机器有关。现在 OpenCV 就陷入了这个错误。:/ (3认同)
  • 在链接的博客文章中,“Windows,当使用 COLORREF 指定颜色值时,它们使用 BGR 格式 0x00bbggrr。” — Windows 一直在中位数机器上使用,因此 0x00bbggrr 在内存中存储为“rrggbb00”,即 RGB! (3认同)
  • @fmw42 好问题!这主要是出于历史原因。这是与相机制造商最兼容的格式,因此一旦加载数据,您无需执行任何额外的操作即可将其转换为我们最终熟悉的格式:https://learnopencv.com/why-does -opencv-使用-bgr-颜色格式/ (2认同)