opencv 中的 BMP 不是无损的吗?

Isn't BMP in opencv lossless?

本文关键字:中的 BMP opencv      更新时间:2023-10-16

我正在使用OpenCV c++测试BMP格式的灰度图像。

下面是代码示例:
Mat img_cv = imread("test.jpg");
imwrite("aaa.bmp", img_cv);
Mat img_cv2 = imread("aaa.bmp")

由于BMP格式是无损的,img_cv和img_cv2应该是相同的,但它们不是。这是输出样本,10x10灰度图像;

img_cv:

41 41 41 64 64 64 47 47 47 42
29 29 29 36 36 36 60 60 60 57
68 68 68 52 52 52 61 61 61 228
42 42 42 33 33 33 160 160 160 229
47 47 47 68 68 68 128 128 128 171
38 38 38 50 50 50 97 97 97 70
67 67 67 67 67 67 66 66 66 104
104 104 104 105 105 105 99 99 99 95
95 95 95 115 115 115 115 115 115 113
74 74 74 74 74 74 90 90 90 115

img_cv2

41 64 47 42 55 76 197 177 54 62
29 36 60 57 200 248 246 240 160 51
68 52 61 228 248 247 248 242 158 48
42 33 160 229 237 240 244 194 62 43
47 68 128 171 96 113 77 74 66 55
38 50 97 70 98 64 88 69 71 40
67 67 66 104 87 102 98 76 56 57
104 105 99 95 92 107 85 87 60 51
95 115 115 113 109 103 112 99 57 63
74 74 90 115 119 113 124 92 51 47

所以我在处理BMP格式时做错了什么或错过了什么?

您只是误解了位图的二进制数据。源位图是每像素24位,而新位图是每像素8位。注意在源上,每个值重复了三次。(3乘以8位字节= 24位)如果你只是把每三个字节组合成一个字节,它匹配目标位图。你似乎也截断了你发布的源位图中1/3的二进制数据。

所以这个翻译是无损的只有当源真的是完全灰度。如果OpenCV确实隐式地将它从24bpp转换为8bpp,那么它可能是一个无损操作。