在 C++ 中使用 imwrite 到 jpg 文件时像素值发生了变化

the pixel values changed while using imwrite to jpg files in c++

我正在用 C++ 编写这样的代码: 我希望有 test1.jpg 的 100% 相同的副本图像。 不幸的是,我发现很多像素值在 cv::imwrite.

之后发生了变化
int main()
{
    cv::Mat img1 = cv::imread("./test1.jpg");
    cv::imwrite("test2.jpg", img1);
    cv::Mat img2 = cv::imread("./test2.jpg");
    int count = 0;
    for (int i = 0; i < 250; i++) {
        for (int j = 0; j < 250; j++) {
            
                if (img1.at<uchar>(i, j) != img2.at<uchar>(i, j)) {
                    count++;
                
            }
        }
    }
    std::cout << count << std::endl;
    return 0;
}

我在这个程序中使用计数来查看这两张图像之间有多少差异, 尽管两张图片(test1.jpg 和 test2.jpg)大小相同,均为 46kb,但计数值高达 16768!

有什么方法可以避免像素变化?我只打算在程序中使用 jpg 文件。 非常感谢!

如果你想 non-lossy 压缩,你不能使用 jpg,必须使用 .png(也有 .bmp,但未压缩)

jpg = cv.imread("../resources/fisheye/1_1.jpg")
cv.imwrite("1_1.png", jpg)
png = cv.imread("1_1.png")
np.sum(np.where(jpg != png, 1, 0)) # number of differing pixels between images

输出:0