【问题标题】:the pixel values changed while using imwrite to jpg files in c++ [duplicate]在c ++中使用imwrite到jpg文件时像素值发生了变化[重复]
【发布时间】:2022-01-22 16:35:17
【问题描述】:

我正在用 C++ 编写这样的代码: 我希望有一个 100% 相同的 test1.jpg 副本图像。 不幸的是,我发现很多像素值在 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;
}

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

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

【问题讨论】:

  • jpeg 有损。像素会改变。大小无关紧要。
  • 那么png文件或其他类型的图片可以避免这个问题吗?
  • @Happy_Dunckey 是的,一个 .png 文件就可以了。我不明白为什么你被否决了,这是你刚开始时很容易犯的错误

标签: c++ opencv image-processing


【解决方案1】:

如果您想要无损压缩,则不能使用 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

【讨论】:

  • 非常感谢。我现在就试试!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多