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


But that doesn't work. Why?

  • $\begingroup$ What do you mean by "it doesn't work"? Image[ImageData[ExampleData[{"TestImage", "Mandrill"}]]] works fine... $\endgroup$ – dr.blochwave Feb 26 '16 at 19:36
  • 1
    $\begingroup$ Actually Image[ImageData[ExampleData[{"TestImage", "Mandrill"}]]] == ExampleData[{"TestImage", "Mandrill"}] returns false. If you look at FullForm you see the image color representation has changed from interger to float. $\endgroup$ – george2079 Feb 26 '16 at 19:49
  • $\begingroup$ If you use for example a black 24-bit Bitmap image, then what you will get back is a blue image. $\endgroup$ – Anton Alice Feb 26 '16 at 19:52
  • $\begingroup$ I colud have sworn this is a duplicate or at least thoroughly discussed in another question but can't find it. $\endgroup$ – William Feb 27 '16 at 4:53
  • $\begingroup$ Strongly related: "ImageType used by ImageData." $\endgroup$ – Alexey Popkov Feb 27 '16 at 7:33

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

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

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

img3 = Image[
   ImageData[ExampleData[{"TestImage", "Mandrill"}], "Byte"], "Byte"];
(* 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]
| improve this answer | |
  • 2
    $\begingroup$ puzzled myself.. this gets it back: Image[ImageData[ExampleData[{"TestImage", "Mandrill"}], "Byte"], "Byte", ColorSpace -> "RGB"] $\endgroup$ – george2079 Feb 26 '16 at 20:05
  • 1
    $\begingroup$ probably more general: img1 === Image[ImageData[#, ImageType[#]], ImageType[#], Options[#]] &[img1] $\endgroup$ – Kuba Feb 26 '16 at 20:08
  • $\begingroup$ 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? $\endgroup$ – Anton Alice Feb 26 '16 at 20:36
  • 1
    $\begingroup$ @AntonAlice It denotes the transparency, or "alpha" value. $\endgroup$ – dr.blochwave Feb 26 '16 at 20:46

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.