OpenCV imwrite为jpeg图像提供了褪色结果

时间:2015-10-15 07:47:48

标签: image opencv image-processing opencv3.0

我正在使用OpenCV 3.0,每当我读取图像并将其写回时,结果就是褪色的图像。

cv::Mat img = cv::imread("dir/frogImage.jpg",-1);
cv::imwrite("dir/result.jpg",img);

有谁知道造成这种情况的原因是什么?

原件: enter image description here

结果: enter image description here

3 个答案:

答案 0 :(得分:2)

这是因为您将图像保存为JPG。这样做时,OpenCV将压缩图像。 尝试将其保存为PNG或BMP,并且不存在任何差异。

然而,重要问题:我将图片加载为 jpg 并将其另存为 JPG 。那么,有什么区别?!

是的,这是因为JPG有许多不完全相同的压缩/解压缩算法。

如果你想了解一些细节,请看这个问题: Reading jpg file in OpenCV vs C# Bitmap

修改 你可以在这里看到我的意思:

auto 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);

结果: [0.576938,0.466718,0.495106,0]

答案 1 :(得分:2)

您可以尝试增加压缩质量参数,如OpenCV Documentation of cv::imwrite

所示
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.它会(afaik)仍然会引入额外的小文物,因为它毕竟是有损的压缩方法。

UPDATE 您的问题似乎不是因为压缩工件,而是因为图片的颜色格式为Adobe RGB 1998。 OpenCV按原样解释颜色值,但它应该缩放颜色值以适应“真实”RGB颜色空间。浏览器和一些图像查看器确实正确应用了颜色格式,而其他人没有(例如irfanView)。我用GIMP来验证。使用GIMP,您可以决定启动时如何按格式解释颜色值,获取您想要的或“褪色”的图像。 OpenCV绝对不关心这些事情,因为它不是照片编辑库,因此无论是在阅读还是写作时,都不会处理颜色格式。

答案 2 :(得分:0)

正如@Micha评论的那样:

cv::Mat img = cv::imread("dir/frogImage.jpg",-1);
cv::imwrite("dir/result.bmp",img);

当mspaint.exe对jpeg图像执行相同操作时,我总是很恼火。特别是截图...它每次都毁了它们。