8
$\begingroup$

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?

$\endgroup$
5
  • $\begingroup$ What do you mean by "it doesn't work"? Image[ImageData[ExampleData[{"TestImage", "Mandrill"}]]] works fine... $\endgroup$ Commented Feb 26, 2016 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
    Commented Feb 26, 2016 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$ Commented Feb 26, 2016 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
    Commented Feb 27, 2016 at 4:53
  • $\begingroup$ Strongly related: "ImageType used by ImageData." $\endgroup$ Commented Feb 27, 2016 at 7:33

1 Answer 1

8
$\begingroup$

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]
$\endgroup$
4
  • 2
    $\begingroup$ puzzled myself.. this gets it back: Image[ImageData[ExampleData[{"TestImage", "Mandrill"}], "Byte"], "Byte", ColorSpace -> "RGB"] $\endgroup$
    – george2079
    Commented Feb 26, 2016 at 20:05
  • 1
    $\begingroup$ probably more general: img1 === Image[ImageData[#, ImageType[#]], ImageType[#], Options[#]] &[img1] $\endgroup$
    – Kuba
    Commented Feb 26, 2016 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$ Commented Feb 26, 2016 at 20:36
  • 1
    $\begingroup$ @AntonAlice It denotes the transparency, or "alpha" value. $\endgroup$ Commented Feb 26, 2016 at 20:46

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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