-2

The pixel values of jpeg and jpg changes even when I simply load an image and just save it.
The values kept on changing on consecutive runs.
This is not the case when I do the same to a png image.
I have demonstrated it using opencv and imageio.

import cv2
import imageio
import numpy as np

# Using opencv
im = cv2.imread("img.jpeg")
cv2.imwrite("img_save1.jpeg", im)

im2 = cv2.imread("img_save1.jpeg")
cv2.imwrite("img_save2.jpeg", im2)

im3 = cv2.imread("img_save2.jpeg")
print("Opencv ", np.sum(np.abs(im - im2)), np.sum(np.abs(im - im3)), np.sum(np.abs(im2 - im3)), sep=',  ')

# Using imageio
im = imageio.imread("img.jpeg")
imageio.imwrite("img_save1.jpeg", im)

im2 = imageio.imread("img_save1.jpeg")
imageio.imwrite("img_save2.jpeg", im2)

im3 = imageio.imread("img_save2.jpeg")
print("Imageio ", np.sum(np.abs(im - im2)), np.sum(np.abs(im - im3)), np.sum(np.abs(im2 - im3)), sep=',  ')

Output:

Opencv ,  3960369,  4185747,  947042
Imageio ,  10047893,  10064129,  280428

For png file

# Using opencv
im = cv2.imread("ig.png")
cv2.imwrite("ig_save1.png", im)
im2 = cv2.imread("ig_save1.png")
print("Opencv: ", np.sum(np.abs(im - im2)))

# Using imageio
im = imageio.imread("ig.png")
imageio.imwrite("ig_save1.png", im)
im2 = imageio.imread("ig_save1.png")
print("imageio: ", np.sum(np.abs(im - im2)))

Output:

Opencv:  0
Imageio:  0

1 Answers1

2

JPEG is a lossy algorithm. It will modify the pixel values every time you run it on image data.

PNG is lossless, it will perfectly preserve the pixel values.

bugmenot123
  • 1,069
  • 1
  • 18
  • 33