通过 numpy 进行 OpenCV BGR2RGB 转换 slicing/stride

OpenCV BGR2RGB Conversion via numpy slicing/stride

我正在尝试学习 OpenCV,但我对这些东西很陌生(Python,OpenCV)。

这是我正在关注的 link And here is the part i don't understand

第一课中有一个题目是为什么要用RGB和BGR的转换。我知道 matplotlib 使用的是 RGB 而 OpenCV 使用的是 BGR(如果我错了请纠正我)。但是无法使用此代码了解如何将 BGR 转换为 RGB:

coke_img_channels_reversed = coke_img[:, :, ::-1]

plt.imshow(coke_img_channels_reversed)

而且我无法判断转换是完全在矩阵还是数组中完成的。 此代码如何将 BGR 的顺序更改为 RGB。谁能从数学上或逻辑上解释一下?

对于最后一个维度的颜色通道,可以这样想:你有三个矩阵 B (mxn)、G (mxn) 和 R (mxn),它们“堆叠”在每个矩阵的顶部另一个是 B 在底部,G 在中间,R 在顶部。如果它们是真正独立的矩阵,你可以像这样将它们堆叠在 numpy 中

bgr_image = np.concatenate((B[:, :, None], G[:, :, None], R[:, :, None]), axis=2) 

当你在做手术的时候

rgb_image = bgr_image[:, :, ::-1]  

您正在翻转 BGR 堆栈,现在 R 在底部,G 在中间,B 在顶部。从数组运算(切片表示法)来看:bgr_image[:, :, ::-1]是bgr_image的所有“行”(dim0),所有“列”( bgr_image 的 dim1),并在“通道”(dim2) 中首先获取最后一个通道,然后一个接一个地构建回第一个通道(有效地将通道顺序从 BGR 反转为 RGB) .该操作可以更明确地重写为

rgb_image = bgr_image[0::1, 0::1, -1::-1]

或者如果你想在明确性方面走得太远,你可以做

m, n, c = bgr_image.shape
rgb_image = bgr_image[0:m:1, 0:n:1, -1::-1]

OpenCV只是把它做成了一个方便的函数,虽然操作简单。他们还尝试非常接近地镜像 C++ 库,在 C++ 中,矩阵移位不是很简单,BGRtoRGB 函数非常方便。