简洁说清楚图像数据格式那些事-RGB和BGR
简洁说清楚图像数据格式那些事-RGB和BGR
1 JPG 文件默认以 RGB 颜色空间编码存储.
同样 .png 也是这样的格式。
2 读文件
主流包:opencv; PIL和matlib
opencv:按照BGR格式读; PIL和matlib按照RGB格式读;
-> 使用opencv读 jpg -> 默认会把原RGB存储转读为BGR;-> 效果就是 如果遇到颜色异常(如红蓝反色)
-> 正解就是[如果使用PIL 可以不用这一步]
import cv2 image = cv2.imread("image.jpg") image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
聪明的你也许可以想到:image 如果是矩阵数据了 可以更简单的 image = image[::-1],倒序即可,实现BGR -> RGB
之所以这么做 就是因为模型 要求RGB数据。
3 搅局的包
搅局:深度学习框架(如 PyTorch)通常要求输入张量的格式是 CHW
而图像读取库(如 OpenCV、Pillow)返回的格式是 HWC。
所以你以为转到RGB就可以了 实际还得转换。
np.einsum("HWC->CHW", img)
4 更大搅局
HWC->CHW 后内存不连续 -> 某些计算库(如 PyTorch、CUDA)要求张量内存连续,否则可能引发错误或性能下降。
np.ascontiguousarray 函数保证内存连续。
5 一招搞定全部搅局
img = np.ascontiguousarray(np.einsum("HWC->CHW", img)[::-1], dtype=self.ndtype) /255
注意255是归一化,可以不加。
self.ndtype = np.float32
浙公网安备 33010602011771号