我有一个1024x1024的浮点矩阵,我想在文件中保留这个矩阵的符号。为此,我想将符号矩阵保持为Matrix of boolean
,但我没有这样做。
假设,我的矩阵是:
2.312, 0.232, -2,132
5.754, -4,34, -3.23
-4.34, -1.23, 7.9453
我的输出应该是
1,1,0
1,0,0
0,0,1
因为float是4Byte而我的矩阵大小是10^20(1M)
,大小是4MB,布尔值是1位,矩阵大小是1M,我希望bool mat大约是1Mb=128KB
但是,当我使用{ threshold
我的输出文件中的{1}}方法是opencv
,这意味着文件保存为uchar(8位)。
我尝试使用imwrite,但它没有用。
编辑:我意识到我没有提到速度也是我测试的另一个重要因素。我从磁盘上加载了大约1000万个1K * 1K矩阵。
提前致谢
答案 0 :(得分:1)
在OpenCV中你可以写
Mat input;
Mat A = (input >= 0);
现在的问题是OpenCV没有位图数据类型。所以你能得到的最好的是Mat1u(unsigned char)。
如果您想节省存储空间,则需要自行完成。例如,您可以使用libpng写出位深度为1的PNG文件。不幸的是,imwrite
不支持设置该位深度(它可以写入位深度为8和16的PNG)。 / p>
如果你想用bitdepth 8编写一个压缩的PNG,你可以使用imwrite
:
std::vector<int> flags;
flags.push_back(CV_IMWRITE_PNG_COMPRESSION);
flags.push_back(9); // [0-9] 9 being max compression, default is 3
cv::imwrite("output.png", A, flags);
这将带来最佳压缩效果。现在,您可以使用Imagemagick将文件大小与存储在位深度1的相同图像进行比较:
convert output.png -type Bilevel -define "png:bit-depth=1" -define "png:compression-level=9" output-1b.png
我使用随机示例图像进行了测试(见下文)。
正如您所看到的,在此示例中,压缩的8位存储仍然胜过未压缩的1位存储。