gpt4 book ai didi

c++ - 将 OpenCV bool 矩阵存储在磁盘上

转载 作者:太空宇宙 更新时间:2023-11-03 22:57:49 24 4
gpt4 key购买 nike

我有一个 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,boolean 是 1bit,矩阵大小是 1M,我希望 bool mat 在 左右1Mb=128KB 然而,当我在 opencv 中使用 threshold 方法时,我的输出文件是 1MB 这意味着文件被保存为 uchar (8 位)。

我尝试使用 imwrite 但它不起作用。

编辑:我意识到我没有提到速度也是我测试的另一个重要因素。我正在从磁盘加载大约 1000 万个 1K*1K 矩阵。

提前致谢

最佳答案

在 OpenCV 中你可以写

Mat input;
Mat A = (input >= 0);

现在的问题是 OpenCV 没有位图数据类型。所以你能得到的最好的是 Mat1u (unsigned char)。

如果您想节省存储空间,您需要自己动手。例如,您可以使用 libpng写出位深度为 1 的 PNG 文件。不幸的是,imwrite 不支持设置该位深度(它可以写入位深度为 8 和 16 的 PNG)。

如果你想写一个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 位,压缩 PNG:24,732 字节
  • 1 位,压缩 PNG:20,529 字节
  • 8 位,未压缩的 PGM:270,015 字节
  • 1 位,未压缩的 PBM:34,211 字节

如您所见,在此示例中,压缩的 8 位存储仍然优于未压缩的 1 位存储。

Example bitmap

关于c++ - 将 OpenCV bool 矩阵存储在磁盘上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25524948/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com