【问题标题】:Confusion regarding Image compression algorithms关于图像压缩算法的困惑
【发布时间】:2011-07-31 17:48:51
【问题描述】:

我一直在阅读Image Compression (Lossy and Non-lossy) 上的网页。

现在这是我的问题,我成功地使用 opencv 制作了人脸检测项目 - 但是 - 我的项目指南不满意 - 我的项目只是从捕获设备 [网络摄像头] 捕获帧并在函数中传递帧检测这些帧中的人脸并在 Windows 中输出检测帧。

我的项目指南希望我实现一些图像压缩或变形等算法,但看到如此大量使用库并不高兴 -

所以我想知道 - 是否可以使用 C 或 C++ 编码 - 图像压缩算法?如果是,代码大小不会很大吗? (我的项目应该是小项目)

请帮帮我,假设我想使用 C++ 使用 RLE 压缩,我应该怎么做?

【问题讨论】:

  • “是否可以使用 C 或 C++ 图像压缩算法进行编码”。嗯,是的。你觉得图片压缩库是用什么写的>
  • 对于 BMP、JPG 等文件格式需要了解多少

标签: c++ algorithm visual-c++ image-processing


【解决方案1】:

您想发明自己的图像压缩或实现其中一种标准图像压缩? (我假设这是为了某种课程/作业,你不会在现实世界中这样做!)

您可以使用 Run-Length 之类的东西稍微压缩简单的图像,特别是如果您可以减少颜色数量,即。卡通或图形,但对于真正的照片风格的图像,它是行不通的——这就是为什么发明了复杂的有损技术,如 jpeg 或小波。

【讨论】:

  • 对于 BMP、JPG 等文件格式需要了解多少——
  • BMP 微不足道,JPEG 复杂——如果你知道 FFT 的数学原理,理论相对简单,但格式复杂
【解决方案2】:

这很有可能,而且 RLE 压缩非常容易。如果您想了解一种不会使用大量代码的相对直接的 RLE 方法,请查看实现 packbits 的版本。

这里还有另一个链接:http://michael.dipperstein.com/rle/index.html(包括一个带有传统 RLE 和 packbits 源代码的实现)

顺便说一句,请记住,与使用 RLE 方案未压缩的数据相比,使用嘈杂的数据实际上可能会得到 更多 数据。对于大多数“真实世界”图像,尽管应用了某种形式的低通滤波和相对良好的信噪比(即高于 40db),但您应该期望大约 1.5:1 到 1.7:1 的压缩比.

无损压缩的另一种选择是霍夫曼编码……该算法对噪声图像的容忍度更高,因为它通常可以防止在使用 RLE 压缩算法编码时这些类型的图像可能发生的数据扩展。

最后,您没有提到您使用的是彩色图像还是灰度图像……如果是彩色图像,请记住,如果您在平面颜色通道中压缩每个颜色通道,您会发现更大的冗余图像,而不是尝试压缩连续的 RGB 数据。

【讨论】:

    【解决方案3】:

    RLE 是最好的方法。即使是“最简单”的压缩算法也很重要,需要深入了解色彩空间变换、离散正弦/余弦变换、熵等。

    回到 RLE... 循环使用这样的像素:

    cv::Mat img = cv::imread("lenna.png");
    for(int i=0; i < img.rows; i++)
        for(int j=0; i < img.cols; j++)
            // You can now access the pixel value with cv::Vec3b
            std::cout << img.at<cv::Vec3b>(i,j)[0] << " " << img.at<cv::Vec3b>(i,j)[1] << " " << img.at<cv::Vec3b>(i,j)[2] << std::endl;
    

    计算一行中相似像素的数量并将它们存储在任何数据结构中(可能是vector中的&lt; #Occurences, Vec3b &gt;元组?)。一旦你有了最终的vector,别忘了用前面提到的vector(也许在一个简单的compressedImage 结构中)存储你的图像大小,瞧,你只是压缩了一个图像。要将其存储在文件中,我建议您使用boost::serialize 或类似的东西。

    您的最终结构可能类似于:

    struct compressedImage {
      int height;
      int width;
      vector< pair<int, Vec3b> > data;
    };
    

    编码愉快!

    【讨论】:

      【解决方案4】:

      您希望使用空间填充曲线或空间索引实现基于颜色减少的压缩。 si 将 2d 复杂度降低到 1d 复杂度,它看起来像四叉树,有点像分形。想找尼克的希尔伯特曲线四叉树空间索引博客!

      这是另一个有趣的 RLE 编码思想:Lossless hierarchical run length encoding。也许这适合你?

      【讨论】:

        【解决方案5】:

        如果你需要抽象光栅类型,你可以使用GDAL C++库。以下是默认或应要求支持的栅格格式列表:

        http://gdal.org/formats_list.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-24
          • 2013-08-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多