繁体   English   中英

OpenCV BGR2RGB 转换通过 numpy 切片/跨步

[英]OpenCV BGR2RGB Conversion via numpy slicing/stride

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

这是我正在关注的链接 这是我不明白的部分

在第 1 课中,有一个主题是关于为什么我们应该使用 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]

或者,如果您想 go 过于明确,您可以这样做

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

即使操作很简单,OpenCV 也只是方便 function。 他们还尝试非常接近地镜像 C++ 库,其中在 C++ 中,矩阵移位不是很简单,而 BGRtoRGB function 非常方便。

暂无
暂无

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

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