【问题标题】:Store OpenCV boolean matrix on disk在磁盘上存储 OpenCV 布尔矩阵
【发布时间】:2014-08-27 10:37:09
【问题描述】:

我有一个 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

由于浮点数是 4Byte,我的矩阵大小是 10^20(1M),大小是 4MB,布尔值是 1bit,矩阵大小是 1M,我希望 bool mat 在 1Mb=128KB 左右,但是,当我使用 threshold 方法时opencv我的输出文件是1MB,这意味着文件被保存为uchar(8bit)。

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

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

提前致谢

【问题讨论】:

    标签: c++ opencv matrix


    【解决方案1】:

    在 OpenCV 中你可以写

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

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

    如果您想节省存储空间,则需要自己动手。例如,您可以使用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 位存储。

    【讨论】:

    • >= 0 将给出 255 个条目。试试A = (input &gt;= 0)/255;
    • 你能告诉我更多关于如何使用这个工具的信息吗?此外,如果我将sign Mat 转换为 8 位,它会不会很有效,因为imwrite 会压缩我的数据。我想在磁盘中保持矩阵尽可能小,但在 RAM 中保持 8 位是可以的。
    • 查看我编辑的答案。一般来说,当使用正确的压缩参数时,您可能会对 8 位感到满意。
    • 感谢您提供详细且非常好的答案,但是,当我使用压缩(如 jpg、png 等)时,加载时间会随着压缩因子的增加而减少。因此,与 1MB 未压缩文件相比,这些压缩图像的加载时间更长。我在我的问题中添加了一行。谢谢,
    猜你喜欢
    • 2014-05-23
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 2011-06-08
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多