8

I assumed that Image and ImageData are inverses, so that the following expression gives back the original image.

Image[ImageData[image]]

But that doesn't work. Why?

m_goldberg
  • 107,779
  • 16
  • 103
  • 257
Anton Alice
  • 379
  • 1
  • 9

1 Answers1

8

I would guess it's something to do with the ImageType.

img1 = ExampleData[{"TestImage", "Mandrill"}];
img2 = Image[ImageData[ExampleData[{"TestImage", "Mandrill"}]]];    
img1 == img2
(* False *)
ImageType[img1]
(* Byte *)    
ImageType[img2]
(* Real *)

However, trying the following doesn't seem to help:

img3 = Image[
   ImageData[ExampleData[{"TestImage", "Mandrill"}], "Byte"], "Byte"];
ImageType[img3]
(* Byte *)    
img3 == img1
(* False *)

But the following (courtesy of @george2079) does work! It must be related to the default option for Image being the following, rather than RGB, so the original colorspace is not preserved.

ColorSpace -> Automatic treats values as arbitrary channel intensities

img4 = Image[
  ImageData[ExampleData[{"TestImage", "Mandrill"}], "Byte"], "Byte", 
  ColorSpace -> "RGB"]
img1 == img4
(* True *)

Hence the following code from @Kuba should work generally:

Image[ImageData[#, ImageType[#]], ImageType[#], Options[#]] &[img1]
dr.blochwave
  • 8,768
  • 3
  • 42
  • 76
  • 2
    puzzled myself.. this gets it back: Image[ImageData[ExampleData[{"TestImage", "Mandrill"}], "Byte"], "Byte", ColorSpace -> "RGB"] – george2079 Feb 26 '16 at 20:05
  • 1
    probably more general: img1 === Image[ImageData[#, ImageType[#]], ImageType[#], Options[#]] &[img1] – Kuba Feb 26 '16 at 20:08
  • Shouldn't the ColorSpace of RGB provide only 3 parameters? A black bmp image mentioned above comes with a ColorSpace of RGB, but the ImageData looks like {{0,0,0,255},{0,0,0,255}...}. What does the 4th parameter do? – Anton Alice Feb 26 '16 at 20:36
  • 1
    @AntonAlice It denotes the transparency, or "alpha" value. – dr.blochwave Feb 26 '16 at 20:46