现象
imwrite是一个很简单的函数,不过最近使用时发现如果保存为.jpg格式会影响灰度值,而保存为bmp格式灰度值不会发生变化。
原因
bmp格式的图片是不带任何压缩,而有些图片格式是自带压缩的,比如jpg格式,因此图像的灰度值发生变化。
测试代码
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Mat src_image, reload_jpg_image, reload_bmp_image;src_image = imread("D:/12.jpg");resize(src_image, src_image, Size(10, 10));cout << "保存之前的前两行数据:" << endl;for (size_t i = 0; i < 2; i++){unsigned char* row_data = src_image.ptr<unsigned char>(i);for (size_t j = 0; j < 10 ; j++){cout << (int)row_data[j] << ",";}cout << endl;}cout << endl;imwrite("D:/12_bmp.bmp", src_image);reload_bmp_image = imread("D:/12_bmp.bmp");cout << "保存为bmp格式的前两行数据:" << endl;for (size_t i = 0; i < 2; i++){unsigned char* row_data = reload_bmp_image.ptr<unsigned char>(i);for (size_t j = 0; j < 10; j++){cout << (int)row_data[j] << ",";}cout << endl;}cout << endl;imwrite("D:/12_jpg.jpg", src_image);reload_jpg_image = imread("D:/12_jpg.jpg");cout << "保存为jpg格式的前两行数据:" << endl;for (size_t i = 0; i < 2; i++){unsigned char* row_data = reload_jpg_image.ptr<unsigned char>(i);for (size_t j = 0; j < 10; j++){cout << (int)row_data[j] << ",";}cout << endl;}cout << endl;system("pause");return 0;
}