gpt4 book ai didi

image-processing - 如何指定 JPEG 压缩的比特率?

转载 作者:太空宇宙 更新时间:2023-11-03 20:43:55 25 4
gpt4 key购买 nike

有没有办法以特定比特率对 JPEG 进行编码?

目前,我正在使用 imagemagick 的 convert:

convert Lenna-gray-100.jpeg -quality 1.1111 test.jpeg

比特率随着质量的增加而增加,但它是非线性的。我想明确控制比特率。它不必非常精确,但我希望它相当接近(在指定设置的 0.1 bpp 之内)。

是否有任何编码器允许以特定比特率对图像进行编码?它不一定是 imagemagick,我会采用任何有效的方法(最好是在 Linux 上)。

执行此操作的一种愚蠢方法是使用 -quality 参数的分数值,直到出现接近目标比特率的值,但我希望有一个更优雅的解决方案。

编辑:

所以我感到无聊并决定以快速(但愚蠢)的方式做事。

首先,这是 imagemagick 的 -quality 与比特率的关系图:

alt text

顺便说一句,这是我使用的图像:

alt text

因此比特率的变化对于较低的质量值来说非常好,但在大约 80 之后变得粗糙。

下面是一些示例代码,用于以某个目标比特率对图像进行编码。我使用 OpenCV,因为它允许内存中的 JPEG 编码(不需要 I/O)。虽然我最初打算用 Python 对此进行模拟,但不幸的是,Python OpenCV 包装器没有公开内存中编码功能。所以我用 C++ 编写了它。

最后,我想在质量上使用线性插值来更接近目标比特率,但由于 cv::imencode 只接受整数参数,因此无法设置非整数JPEG 质量。 OpenCV 和 imagemagick 之间的质量尺度似乎也有所不同,因此从 OpenCV 中获取内插质量参数并在 imagemagick 的 convert 中使用效果不佳。

这意味着输出比特率不等于目标比特率,尤其是在较高比特率 ( > 1) 时。但它很接近。

谁能提出更好的建议?

代码:

#include <stdio.h>
#include <cv.h>
#include <highgui.h>
#include <assert.h>
#include <vector>

using cv::Mat;
using std::vector;

#define IMENCODE_FMT ".jpeg"
#define QUALITY_UBOUND 101
#define BITS_PER_BYTE 8

int
main(int argc, char **argv)
{
if (argc != 4)
{
fprintf(stderr, "usage: %s in.png out.jpeg bpp\n", argv[0]);
return 1;
}

char *fname_in = argv[1];
char *fname_out = argv[2];
float target;
sscanf(argv[3], "%f", &target);

Mat orig = cv::imread(fname_in);
int pixels = orig.size().width * orig.size().height * orig.channels();

vector<unsigned char> buf;
vector<int> params = vector<int>(2);
params[0] = CV_IMWRITE_JPEG_QUALITY;
int q;
double bpp = 0.0;

for (q = 1; q < QUALITY_UBOUND; ++q)
{
params[1] = q;
cv::imencode(IMENCODE_FMT, orig, buf, params);
bpp = (double)buf.size() * BITS_PER_BYTE / pixels;
if (bpp > target)
break;
}

cv::imwrite(fname_out, orig, params);
printf("wrote %s at %d%% quality, %.2fbpp\n", fname_out, q, bpp);

return 0;
}

编译运行使用:

g++ -c -Wall -ggdb -I../c -I../blur `pkg-config --cflags opencv` -Wno-write-strings jpeg-bitrate.cpp -o jpeg-bitrate.o
g++ -I../c `pkg-config --cflags opencv` `pkg-config --libs opencv` -lboost_filesystem jpeg-bitrate.o -o jpeg-bitrate.out
rm jpeg-bitrate.o
misha@misha-desktop:~/co/cpp$ ./jpeg-bitrate.out Lenna-gray.png test.jpeg 0.53
wrote test.jpeg at 88% quality, 0.55bpp

最佳答案

我知道在控制 JPEG 编码器的输出比特率方面有很多工作(例如 1st paper ; 2nd paper ),并且 JPEG2000 中存在此类控件。不幸的是,我不确定任何类型的比特率控制是否针对 JPEG 进行了标准化,或者是否在公共(public)库中实现了。您可能必须编写自己的方法,例如使用某种二进制搜索...

但是,我可能又错了——如果是的话,我很想听听这样一个图书馆。

出于好奇,您使用的是什么语言?

关于image-processing - 如何指定 JPEG 压缩的比特率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4677552/

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