cv::Mat img = cv::imread("dir/frogImage.jpg",-1);
std::vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_JPEG_QUALITY);
compression_params.push_back(100);
cv::imwrite("dir/result.jpg",img, compression_params);
如果没有手动指定压缩质量,将应用95%的质量。
但是,1.您不知道原始图像的jpeg压缩质量(因此可能会增加图像大小),2.它仍然会引入额外的轻微伪影,因为毕竟这是一种有损压缩方法。
更新:您的问题似乎不是由于压缩伪影,而是由于使用了Adobe RGB 1998
颜色格式的图像。OpenCV根据实际情况解释颜色值,但实际上应该将颜色值缩放到“真实”的RGB颜色空间中。浏览器和一些图像查看器正确应用颜色格式,而其他一些则不会(例如irfanView)。我使用GIMP进行验证。使用GIMP,您可以在启动时决定如何按格式解释颜色值,无论是获取所需的还是获取“褪色”的图像。OpenCV绝对不关心这些事情,因为它不是一个照片编辑库,因此在读取或写入时,都不会处理颜色格式。
Adobe RGB 1998
色彩空间。https://en.wikipedia.org/wiki/RGB_color_space - Mickaauto bmp(cv::imread("c:/Testing/stack.bmp"));
cv::imwrite("c:/Testing/stack_OpenCV.jpg", bmp);
auto jpg_opencv(cv::imread("c:/Testing/stack_OpenCV.jpg"));
auto jpg_mspaint(cv::imread("c:/Testing/stack_mspaint.jpg"));
cv::imwrite("c:/Testing/stack_mspaint_opencv.jpg", jpg_mspaint);
jpg_mspaint=(cv::imread("c:/Testing/stack_mspaint_opencv.jpg"));
cv::Mat jpg_diff;
cv::absdiff(jpg_mspaint, jpg_opencv, jpg_diff);
std::cout << cv::mean(jpg_diff);
正如 @Micha 的评论所述:
cv::Mat img = cv::imread("dir/frogImage.jpg",-1);
cv::imwrite("dir/result.bmp",img);
每当 mspaint.exe 对 JPEG 图像做同样的事情时,我总是感到很烦恼。特别是对于截图...它每次都会破坏它们。
jpeg
。也许像这样的应用程序:1. 读取图像;2. 执行一些操作;3. 以旧格式保存
,但重要的是要告诉 @Zindarod,在这种情况下,对于 jpeg 图像会有额外的伪影。这就是为什么 GIMP 等使用自己的图像格式并且只通过导出来创建 jpegs/pngs 等格式的原因之一。 - Micka
.png
或其他无损压缩技术。 - Micka