在OpenCV中自动选择最佳JPEG压缩?
我想知道是否有办法在OpenCV中自动选择一个合理的JPEG压缩级别 我得到的当前JPEG大小太大,将其固定为一个固定值感觉很脏。如果我还记得像Dreamweaver这样的图像编辑器中存在这样的功能。如果没有这样的特性,我还想知道是否有人知道一种算法能够在不执行硬盘IO的情况下估计这个参数在OpenCV中自动选择最佳JPEG压缩?,opencv,Opencv,我想知道是否有办法在OpenCV中自动选择一个合理的JPEG压缩级别 我得到的当前JPEG大小太大,将其固定为一个固定值感觉很脏。如果我还记得像Dreamweaver这样的图像编辑器中存在这样的功能。如果没有这样的特性,我还想知道是否有人知道一种算法能够在不执行硬盘IO的情况下估计这个参数 std::vector<int> params; params.push_back(CV_IMWRITE_JPEG_QUALITY); params.push_back(magic); //Wa
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);
std::向量参数;
参数推回(CV\u IMWRITE\u JPEG\u质量);
参数。推回(魔法)//想要一种评估魔法的方法吗
cv::imwrite(“my.jpg”,图像,参数);
很抱歉,在压缩文件之前,无法确定大小。如果您不着急,请使用不同的质量值压缩图像,然后选择最佳值。不幸的是,要“优化”JPEG压缩,必须学习并应用有关JPEG压缩的许多技术细节。因此,许多库不提供全套调整参数。0-100 JPEG质量参数已经是一个很好的折衷方案
ImageMagick可能具有这样的功能
您正在寻找一种“在OpenCV中自动选择合理的JPEG压缩级别”的方法 然而,“合理”是主观的,取决于图像所有者对给定图像中哪些特征重要的感知。这意味着(不同的所有者)x(不同的图像)的每个组合的感知都可能不同
- 简短的回答
- 不,OpenCV目前不提供此功能
- “系统管理员”的答案
- 看看OpenCV ImageMagick集成
- 又快又脏的回答
- 使用二分法(0、100、50、75、87等)搜索接近指定输出文件大小的JPEG质量级别
- 也可能适用。
- 编辑:可能没有用处,因为在没有分析模型的情况下无法获得质量文件大小曲线的一阶导数
- 显然,这对于实际的日常使用来说效率太低,所以图书馆没有提供李>
- 如果你想使用它,你必须用你自己选择的技术来实现它
- 要避免磁盘I/O
- 略长的答案
- 虽然它没有实现这个功能,但很明显,它是一个很好的特性李> <>如果有人愿意在OpenCV使用代码质量很好的代码,OpenCV可以考虑接受它。
- 更长的答案
- OpenCV使用或(可选),两个库都允许配置JPEG压缩的技术细节李>
- 下面我将重点介绍这些技术细节
先读:关于维基百科
在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压缩的“有损步骤”。因此,技术用户必须确定可接受的损耗(量化)程度,然后相应地配置量化表
- 哈夫曼表
- 是一种无损压缩技术。换句话说,如果人们真的可以花时间基于整个图像的量化DCT系数的统计来优化哈夫曼编码表,那么人们通常可以构造一个好的哈夫曼表来优化压缩,而不必牺牲质量
- 不幸的是,现实更为复杂,这种优化往往无法实现。
- 它需要将整个图像的所有DCT系数都保存在内存中。这会增加内存使用量
- 在所有内容都进入内存之前,无法开始写入文件。相反,如果库预先选择量化表和哈夫曼表,而不查看DCT系数的统计数据,则库将能够在处理行和行像素时增量写入文件。由于libjpeg的设计目的是在分母最低的设备(包括智能手表,也许还有你的冰箱?)中使用,因此能够以最小的内存运行是一项重要功能