在OpenCV中自动选择最佳JPEG压缩?

时间:2014-09-27 22:52:58

标签: opencv

我想知道是否有办法在OpenCV中自动选择合理的JPEG压缩级别?

我所获得的当前JPEG尺寸太大,并且将其固定为固定值会感觉很脏。如果我记得像Dreamweaver这样的图像编辑器中存在这些功能。如果没有这样的功能,我也想知道是否有人知道能够在不执行硬盘IO的情况下估计此参数的算法。

std::vector<int> params;
params.push_back(CV_IMWRITE_JPEG_QUALITY);
params.push_back(magic);  //Want a way to estimate magic
cv::imwrite("my.jpg",image,params);

2 个答案:

答案 0 :(得分:2)

不幸的是,要“优化”JPEG压缩,必须学习并应用有关JPEG压缩的许多技术细节。因此,许多图书馆不提供全套调整参数。 0-100 JPEG质量参数已经是一个很好的折衷方案。


ImageMagick可能具有此类功能。


您正在寻找一种“在OpenCV中自动选择合理的JPEG压缩级别”的方法。

然而,“合理”是主观的,并且取决于图像所有者对给定图像中哪些特征是重要的感知。这意味着对于(不同所有者)x(不同图像)的每种组合,感知可能不同。

  • 简短的回答
    • 不,OpenCV目前不提供此功能。
  • “系统管理员”的回答
  • 快速而肮脏的答案
    • 使用二分法(0,100,50,75,87,...)搜索接近指定输出文件大小的JPEG质量等级。
    • Secant method也可能适用。
      • 已编辑:Newton's method可能没用,因为如果没有分析模型,就无法获得质量文件大小曲线的一阶导数。
    • 显然,这对于实际的日常使用而言效率太低,因此库不提供。
    • 如果你想使用它,你必须自己选择技术来实现它。
    • 要避免磁盘I / O,use cv::imencode which writes to memory instead of to disk
  • 稍微长一点的答案
    • 虽然它没有实现这个功能,但很明显它是一个很好的功能。
    • 如果有人愿意以高于OpenCV的代码质量实现它,OpenCV可能会考虑接受它。
  • 更长的答案
    • OpenCV使用jpeglib或可选libjpeg-turbo,两个库都允许用户配置JPEG压缩的技术细节。
    • 下面我将重点介绍这些技术细节。

首先阅读:维基百科上的JPEG compression


在JPEG压缩管道中,jpeglib或libjpeg-turbo的用户​​可以配置三个压缩步骤:

  • 色度子采样
    • 从RGB转换为YCbCr后,色度(载色)通道:色度 - 蓝色和色度 - 红色可选地以相对于亮度(Y)通道的较低分辨率存储,也称为强度或灰度通道,后者始终以全分辨率存储。
    • 大多数JPEG解码器都支持这些下采样因子:
      • (1,1) - 没有子采样
      • (1,2),(2,1),(2,2) - 中等子采样,其中一个或两个维度可以由2进行二次采样。
      • (1,4),(2,4),(4,2),(4,1) - 重子采样。请注意,原始JPEG规范禁止其中一些组合,但大多数JPEG解码器仍能解码它们。
  • 量化表
    • 每个JPEG图像可以定义用于DCT变换系数的“AC系数”的量化表
    • 每个JPEG图像可以定义从DCT变换计算的“DC系数”(即8x8块的平均值)的量化表。
    • 量化是JPEG压缩的“有损步骤”。因此,技术用户必须决定可接受多少损失(量化),然后相应地配置量化表。
  • 霍夫曼表
    • Huffman coding是一种无损压缩技术。换句话说,如果真的可以花时间根据整个图像的量化DCT系数 的统计来优化霍夫曼编码表 ,那么通常可以构建一个好的霍夫曼表格可以优化压缩 而无需权衡质量
    • 不幸的是,现实情况更复杂,并且通常不会启用此类优化。
      • 对于整个图像,它需要将所有DCT系数保留在存储器中。这会增加内存使用量。
      • 直到内存中的所有内容都无法启动写入文件。相反,如果一个库选择量化表和Huffman表 预先,而不查看DCT系数的统计 ,那么该库将能够 在处理像素的行和行时递增地写入文件 。因为libjpeg设计用于最低分母的设备(包括智能手表,也可能是你的冰箱?),能够以最小的内存运行是一个重要的功能。

答案 1 :(得分:0)

很抱歉,在压缩文件之前无法告诉大小。如果您不赶时间,请使用不同的质量值压缩图像,然后选择最佳的图像。