在 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
我正在用 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