我正在使用OpenCV 3.0,每当我读取图像并将其写回时,结果就是褪色的图像。
码
cv::Mat img = cv::imread("dir/frogImage.jpg",-1);
cv::imwrite("dir/result.jpg",img);
有谁知道造成这种情况的原因是什么?
答案 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图像执行相同操作时,我总是很恼火。特别是截图...它每次都毁了它们。