Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

Context

I would like to represent large images with a given colour table.

Now, if I use Image

dat = RandomReal[{0, 1}, {1024, 1024}];
dat // Image; // Timing

(* ==> {0.000027, Null} *)

its fast, but in grayscales; on the other hand if I use, say MatrixPlot

dat // MatrixPlot[#, ColorFunction -> "Temperature"] &
dat // MatrixPlot[#, ColorFunction -> "Temperature"] &; // Timing

(* ==> {1.5748, Null} *)

Mathematica graphics

its in colour, but its slow.

Question

Is there a method to get the best of both worlds? (i.e. Speed and chosen colour table).

Thank you for your help.

share|improve this question
    
I updated my answer. I wonder if there is a faster method available. I think perhaps a compiled function working on the image data directly would do it. –  Mr.Wizard Mar 16 '13 at 15:38
    
I finally remembered why I thought Raster was faster: this comment by Vitaliy Kaurov. –  Mr.Wizard Mar 16 '13 at 16:04
add comment

2 Answers

up vote 5 down vote accepted

I think I finally succeeded in creating something faster.

Edit: now ~40X faster than ArrayPlot.

renderImage[array_?MatrixQ, cf_, opts : OptionsPattern[Image]] :=
 Module[{tbl},
  tbl = List @@@ Array[cf[#/2047`] &, 2048, 0] // N // Developer`ToPackedArray;
  Image[tbl[[# + 1]] & /@ Round[2047 array], opts]
 ]

A test of function:

dat = Map[Mean, ImageData[Import["ExampleData/lena.tif"]], {2}];

ArrayPlot[dat, ColorFunction -> "Rainbow"]

renderImage[dat, ColorData["Rainbow"], ImageSize -> 300]

Mathematica graphics

Mathematica graphics

A test of speed:

big = RandomReal[1, {1500, 1500}];

ArrayPlot[big, ColorFunction -> "Rainbow"] // Timing // First

renderImage[big, ColorData["Rainbow"], ImageSize -> 300] // Timing // First

2.325

0.0624

And this time that's correct timing data.

share|improve this answer
    
Is it fair to say it is still significantly slower than Image? –  chris Mar 16 '13 at 16:49
    
@chris Certainly, but anything is likely to be as the color look-up has to to take some amount of time. Still I believe a compiled function would be faster but that's not my strength so I'll leave it for someone else. This at least lays the foundation. –  Mr.Wizard Mar 16 '13 at 16:52
    
@chris I upgraded my function and it is now about 40 times faster than ArrayPlot. Please take a look. –  Mr.Wizard Mar 16 '13 at 17:15
    
That's a significant improvement indeed. –  chris Mar 16 '13 at 17:21
    
The thing is: by creating a lookup table for the colors you do a quantization which is not done by ArrayPlot. Although, the visual outcome may look the same, we compare two different things here. –  halirutan Mar 16 '13 at 17:47
show 11 more comments

This answer was posted in error. Nevertheless I think the information below is helpful.


I believe the fastest general method is Raster, like this:

Graphics[Raster[RandomReal[1, {10, 20}], ColorFunction -> "Rainbow"]]

Mathematica graphics


Actually, this isn't any faster than MatrixPlot, it's just different. With MatrixPlot the time is spent when the graphic is created, and with Raster it is spent when it is displayed:

Timing[g1 = MatrixPlot[dat, ColorFunction -> "Temperature"];]
Timing[g2 = Graphics[Raster[dat, ColorFunction -> "Temperature"]];]

{0.639, Null}

{0., Null}

To see the rendering time set:

SetOptions[$FrontEndSession, EvaluationCompletionAction->"ShowTiming"]

Then:

g1

g2

and you will see that g1 displays immediately, whereas g2 takes about as long to render as it did to create g1.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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