rlar
rlar

Reputation: 926

using mogrify for lossless conversion from jpg to png

I'm trying to losslessly convert a jpg image into a png image using mogrify. To get this result I'm using this command:

mogrify -format png  test.jpeg

However the test to check if the two images are the same fails. To perform the test I use this python script:

import cv2

jpg_image = cv2.imread("test.jpeg")
png_image = cv2.imread("test.png")

diff = jpg_image - png_image

cv2.imshow("diff", diff)
cv2.waitKey(0)
cv2.closeAllWindows()

If the two images are the same the execution of this script shows a black rectangle.

I tried to make the conversion using opencv and it works. This is the python script that I used to get the result with opencv:

import cv2

jpg_image = cv2.imread("/home/roberto/Downloads/index.jpeg")
cv2.imwrite("/home/roberto/Downloads/index.png", jpg_image)

As suggested in the comments below I also ran the identify -verbose command on the png files generated by mogrify and opencv. These are the outputs:

mogrify

Image: index.png24
  Format: PNG (Portable Network Graphics)
  Mime type: image/png
  Class: DirectClass
  Geometry: 276x183+0+0
  Units: Undefined
  Type: TrueColor
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit
  Channel statistics:
    Pixels: 50508
    Red:
      min: 0 (0)
      max: 153 (0.6)
      mean: 19.2985 (0.0756804)
      standard deviation: 16.1262 (0.06324)
      kurtosis: 4.912
      skewness: 1.86378
      entropy: 0.805148
    Green:
      min: 0 (0)
      max: 176 (0.690196)
      mean: 64.9359 (0.254651)
      standard deviation: 45.101 (0.176867)
      kurtosis: -0.895497
      skewness: 0.554883
      entropy: 0.968001
    Blue:
      min: 0 (0)
      max: 255 (1)
      mean: 144.46 (0.566511)
      standard deviation: 50.6283 (0.198542)
      kurtosis: -0.289594
      skewness: -0.566585
      entropy: 0.950031
  Image statistics:
    Overall:
      min: 0 (0)
      max: 255 (1)
      mean: 76.2316 (0.298948)
      standard deviation: 40.2384 (0.157798)
      kurtosis: 11.4068
      skewness: 2.70212
      entropy: 0.907726
  Rendering intent: Perceptual
  Gamma: 0.45455
  Chromaticity:
    red primary: (0.64,0.33)
    green primary: (0.3,0.6)
    blue primary: (0.15,0.06)
    white point: (0.3127,0.329)
  Background color: white
  Border color: srgb(223,223,223)
  Matte color: grey74
  Transparent color: black
  Interlace: None
  Intensity: Undefined
  Compose: Over
  Page geometry: 276x183+0+0
  Dispose: Undefined
  Iterations: 0
  Compression: Zip
  Orientation: Undefined
  Properties:
    date:create: 2019-03-21T09:51:42+01:00
    date:modify: 2019-03-21T09:51:42+01:00
    png:bKGD: chunk was found (see Background color, above)
    png:cHRM: chunk was found (see Chromaticity, above)
    png:gAMA: gamma=0.45454544 (See Gamma, above)
    png:IHDR.bit-depth-orig: 8
    png:IHDR.bit_depth: 8
    png:IHDR.color-type-orig: 2
    png:IHDR.color_type: 2 (Truecolor)
    png:IHDR.interlace_method: 0 (Not interlaced)
    png:IHDR.width,height: 276, 183
    png:sRGB: intent=0 (Perceptual Intent)
    png:text: 2 tEXt/zTXt/iTXt chunks were found
    signature: 1bdb735da64a7036eb46f2d257997fbd10044ddc633c2aea5703f1887614709c
  Artifacts:
    filename: index-mogrify.png
    verbose: true
  Tainted: False
  Filesize: 79.9KB
  Number pixels: 50.5K
  User time: 0.000u
  Elapsed time: 0:01.000
  Version: ImageMagick 6.9.7-4 Q16 x86_64 20170114 http://www.imagemagick.org

opencv:

Image: index-opencv.png
  Format: PNG (Portable Network Graphics)
  Mime type: image/png
  Class: DirectClass
  Geometry: 276x183+0+0
  Units: Undefined
  Type: TrueColor
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit
  Channel statistics:
    Pixels: 50508
    Red:
      min: 0 (0)
      max: 153 (0.6)
      mean: 19.299 (0.0756825)
      standard deviation: 16.1246 (0.0632336)
      kurtosis: 4.91164
      skewness: 1.86412
      entropy: 0.80384
    Green:
      min: 0 (0)
      max: 175 (0.686275)
      mean: 64.9195 (0.254586)
      standard deviation: 45.064 (0.176722)
      kurtosis: -0.898132
      skewness: 0.553704
      entropy: 0.968909
    Blue:
      min: 0 (0)
      max: 255 (1)
      mean: 144.561 (0.566908)
      standard deviation: 50.7463 (0.199005)
      kurtosis: -0.296128
      skewness: -0.559014
      entropy: 0.950698
  Image statistics:
    Overall:
      min: 0 (0)
      max: 255 (1)
      mean: 76.26 (0.299059)
      standard deviation: 40.2739 (0.157937)
      kurtosis: 11.4583
      skewness: 2.7144
      entropy: 0.907815
  Rendering intent: Perceptual
  Gamma: 0.454545
  Chromaticity:
    red primary: (0.64,0.33)
    green primary: (0.3,0.6)
    blue primary: (0.15,0.06)
    white point: (0.3127,0.329)
  Background color: white
  Border color: srgb(223,223,223)
  Matte color: grey74
  Transparent color: black
  Interlace: None
  Intensity: Undefined
  Compose: Over
  Page geometry: 276x183+0+0
  Dispose: Undefined
  Iterations: 0
  Compression: Zip
  Orientation: Undefined
  Properties:
    date:create: 2019-03-21T09:50:20+01:00
    date:modify: 2019-03-21T09:50:20+01:00
    png:IHDR.bit-depth-orig: 8
    png:IHDR.bit_depth: 8
    png:IHDR.color-type-orig: 2
    png:IHDR.color_type: 2 (Truecolor)
    png:IHDR.interlace_method: 0 (Not interlaced)
    png:IHDR.width,height: 276, 183
    png:sRGB: intent=0 (Perceptual Intent)
    signature: 217fe60358faf232f04ccc66dd92ec508fbf82b37858f0b954c87372720b88a1
  Artifacts:
    filename: index-opencv.png
    verbose: true
  Tainted: False
  Filesize: 89.3KB
  Number pixels: 50.5K
  User time: 0.000u
  Elapsed time: 0:01.000
  Version: ImageMagick 6.9.7-4 Q16 x86_64 20170114 http://www.imagemagick.org

can someone explain me which is the difference between the first and the second approach (mogirfy vs opencv)?

Upvotes: 3

Views: 3930

Answers (1)

Mark Setchell
Mark Setchell

Reputation: 207728

The differences between the two images are negligible. I show the ImageMagick produced one on the left and the OpenCV produced one on the right.

enter image description here

enter image description here

The only differences are a tiny percentage in the pixel data. It is unreasonable to assume that reading a lossy image format such as JPEG with ImageMagick will result in an identical image when read by OpenCV. The format is inherently lossy and decoders are allowed some discretion in the accuracy they achieve and the tradeoffs they make. OpenCV may favour absolute speed and performance, for example. ImageMagick may favour compatibility and accuracy.

Don't forget that, although you only see the pixels as integers between 0..255, they actually get transformed into floats, converted into the frequency domain, quantised, packed and compressed and then the reverse happens when reading.

Upvotes: 3

Related Questions