基于numpy切片/步长的OpenCV BGR转RGB实现原理是什么?
基础认知确认
你提到的「OpenCV默认BGR格式、matplotlib默认RGB格式」的表述完全正确,这是两个库历史实现差异导致的常见兼容问题。
操作对象说明
coke_img是OpenCV通过cv2.imread()读入的三维NumPy数组,维度顺序固定为[高度, 宽度, 通道数],三通道彩色图的最后一维默认顺序为[B, G, R]。你也可以把它理解为三阶矩阵,本质都是结构化的数值存储结构。
切片语法逻辑解释
NumPy的多维度切片语法为[第1维切片, 第2维切片, 第3维切片],单维度切片的通用格式为start:end:step:
- 第一个
::对应高度维度,缺省起止值、步长为1,即保留所有行的像素 - 第二个
::对应宽度维度,同理保留所有列的像素 - 第三个
::-1:对应通道维度,缺省起止值、步长为-1,即把该维度的元素顺序完全反转
三通道的逆序操作就是把原本的[B, G, R]排列直接换成[R, G, B],刚好匹配matplotlib的渲染要求,和调用cv2.cvtColor(coke_img, cv2.COLOR_BGR2RGB)的实现效果完全一致,只是NumPy原生切片的写法更简洁。
示例验证
比如某个像素点在原始数组中的通道值为(255, 0, 0),对应BGR格式的纯蓝色,经过::-1逆序后变为(0, 0, 255),刚好是RGB格式下的纯蓝色,matplotlib渲染时就不会出现色偏。
内容的提问来源于stack exchange,提问作者M Fatih Özkan
相关产品推荐
相关产品推荐

