opencv 中的 BMP 不是无损的吗?
Isn't BMP in opencv lossless?
我正在使用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,那么它可能是一个无损操作。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- .cpp和.h文件中的模板专用化声明
- 反向给定链表中的K节点
- 正在查找文档以获得PS4平台的C++中的设备信息
- enum是C++中的宏变量还是整数变量
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 将字符串存储在c++中的稳定内存中
- 在C++中的SDL2窗口上显示.bmp时出现问题
- 如何在包含数字的.bmp(二进制图像)中执行组件标记9 4 3 6
- 如何在C++的四叉树中存储 bmp 文件?
- 在C++中读取bmp文件的宽度和高度
- 在没有任何外部库的情况下,是否可以在c++/linux的窗口中显示bmp图像
- Windows上代理项对的wchar_t*大小(BMP中的Unicode字符)
- 消除 bmp 数组中的两个零
- C++:.bmp到文件中的字节数组
- 在C++中读取BMP的奇怪行为
- 读取bmp文件中的像素值
- opencv 中的 BMP 不是无损的吗?
- 在C中导入BMP时的环绕问题
- 从Win32项目中的*.bmp文件加载HBITMAP