OpenCV imwrite 给出了 jpeg 图像的褪色结果
OpenCV imwrite gives washed-out result for jpeg images
我正在使用 OpenCV 3.0,每当我读取图像并将其写回时,结果都是褪色的图像。
代码:
cv::Mat img = cv::imread("dir/frogImage.jpg",-1);
cv::imwrite("dir/result.jpg",img);
有人知道这是什么原因吗?
原文:
结果:
正如@Micha 评论的那样:
cv::Mat img = cv::imread("dir/frogImage.jpg",-1);
cv::imwrite("dir/result.bmp",img);
当 mspaint.exe 对 jpeg 图像做同样的事情时,我总是很生气。尤其是截图……每次都毁了
这是因为您将图像保存为 JPG。执行此操作时,OpenCV 将压缩图像。
尝试将其另存为 PNG 或 BMP,不会存在任何差异。
但是,重要问题:我将图像加载为 jpg 并将其保存为 JPG。那么,怎么会有区别呢?!
是的,这是因为 JPG 有许多不相同的 compression/decompression 算法。
如果您想了解一些细节,请参阅以下问题:
编辑:
你可以在这里明白我的意思:
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]
您可以尝试增加压缩质量参数,如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)仍然会引入额外的小瑕疵,因为毕竟它是一种有损压缩方法。
更新 您的问题似乎不是因为压缩伪影,而是因为具有 Adobe RGB 1998
颜色格式的图像。 OpenCV 按原样解释颜色值,但它应该缩放颜色值以适应 "real" RGB 颜色 space。浏览器和一些图像查看器会正确应用颜色格式,而其他浏览器则不会(例如 irfanView)。我用 GIMP 来验证。使用 GIMP,您可以在启动时决定如何按格式解释颜色值,获取您想要的图像或 "washed out" 图像。
OpenCV 绝对不会关心这些事情,因为它不是一个照片编辑库,所以无论是在阅读还是写作上,都会处理颜色格式。
我正在使用 OpenCV 3.0,每当我读取图像并将其写回时,结果都是褪色的图像。
代码:
cv::Mat img = cv::imread("dir/frogImage.jpg",-1);
cv::imwrite("dir/result.jpg",img);
有人知道这是什么原因吗?
原文:
结果:
正如@Micha 评论的那样:
cv::Mat img = cv::imread("dir/frogImage.jpg",-1);
cv::imwrite("dir/result.bmp",img);
当 mspaint.exe 对 jpeg 图像做同样的事情时,我总是很生气。尤其是截图……每次都毁了
这是因为您将图像保存为 JPG。执行此操作时,OpenCV 将压缩图像。 尝试将其另存为 PNG 或 BMP,不会存在任何差异。
但是,重要问题:我将图像加载为 jpg 并将其保存为 JPG。那么,怎么会有区别呢?!
是的,这是因为 JPG 有许多不相同的 compression/decompression 算法。
如果您想了解一些细节,请参阅以下问题:
编辑: 你可以在这里明白我的意思:
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]
您可以尝试增加压缩质量参数,如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)仍然会引入额外的小瑕疵,因为毕竟它是一种有损压缩方法。
更新 您的问题似乎不是因为压缩伪影,而是因为具有 Adobe RGB 1998
颜色格式的图像。 OpenCV 按原样解释颜色值,但它应该缩放颜色值以适应 "real" RGB 颜色 space。浏览器和一些图像查看器会正确应用颜色格式,而其他浏览器则不会(例如 irfanView)。我用 GIMP 来验证。使用 GIMP,您可以在启动时决定如何按格式解释颜色值,获取您想要的图像或 "washed out" 图像。
OpenCV 绝对不会关心这些事情,因为它不是一个照片编辑库,所以无论是在阅读还是写作上,都会处理颜色格式。