MathGroup Archive 2009

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Optimization problem

  • To: mathgroup at smc.vnet.net
  • Subject: [mg96705] Re: [mg96675] Optimization problem
  • From: Daniel Lichtblau <danl at wolfram.com>
  • Date: Sat, 21 Feb 2009 19:40:07 -0500 (EST)
  • References: <200902201046.FAA17890@smc.vnet.net>

Adam Simpson wrote:
> Hi, I'm currently working with some image files in mathematica but am  
> having an optimization problem. What I am basically trying to do is  
> convert an image to HSB color space and then test each pixel to see if  
> the H,S,B values fall within a certain range, making it a 1 if it's in  
> the specified range else a 0. Notice I have multiplied the raw HSV  
> values to have ranges of [0,369], [0,100],[0,100] respectively. I  
> however get an order of magnitude difference between running two  
> operations that I can't rectify.
> 
> Notice the image I am using to that I call "frame" is available for  
> download at http://www.physics.uc.edu/~simpson/page11/files/OptimizationProblem.jpg 
>   :
> 
> //test each pixel to see if the value of Hue,Saturation,Brightness  
> fall within a certain range and make the value 1 if it is, else a 0:
> Image[Map[
>     If[320 <= 359 #[[1]] <= 355 && 65 <= 100 #[[2]] <= 80 &&
>        30 <= 100 #[[3]] <= 75, 1, 0] &,
>     ImageData[frame], {2}]] // AbsoluteTiming
> 
> 0.282983 Seconds
> 
> If however I create a function as such ,even after compiling it which  
> helped slightly, that is equal to the above If statement  I get an  
> order of magnitude higher time.
> 
> 	Hmin=320;
> 	Hmax=359;
> 	Smin=65;
> 	Smax=80;
> 	Bmin=30;
> 	Bmax=75;
> 
> 	PixelMatch = Compile[{{H, _Real}, {S, _Real}, {B, _Real}},
>      If[(Hmin <= H*359 <= Hmax) &&(Smin <= S*100 <=  Smax) &&
>        		(Bmin <= B*100 <= Bmax), 1, 0]]
> 
> Image[Map[PixelMatch[#[[1]], #[[2]], #[[3]]] &,
>     ImageData[frame], {2}]] // AbsoluteTiming
> 
> 2.012571 Seconds
> 
> Any help is highly appreciated.
> 
> Adam Simpson

It's a scoping issue, more or less, having to do with Compile having 
HoldAll attribute. If you check your PixelMatch[[4]] you will see it is 
actually making several function calls.

This can be rectified using either approach below. The first forces an 
evaluation of teh body of the Compile. The second makes the values 
visible to everything inside the With[], including the body of that Compile.

PixelMatch2 = Compile[{{H, _Real}, {S, _Real}, {B, _Real}},
      Evaluate[If[(Hmin <= H*359 <= Hmax) &&(Smin <= S*100 <=  Smax) &&
        		(Bmin <= B*100 <= Bmax), 1, 0]]]

PixelMatch3 = With[
  {Hmin=320, Hmax=359, Smin=65, Smax=80, Bmin=30, Bmax=75},
   Compile[{{H, _Real}, {S, _Real}, {B, _Real}},
      If[(Hmin <= H*359 <= Hmax) &&(Smin <= S*100 <=  Smax) &&
       (Bmin <= B*100 <= Bmax), 1, 0]]]

Daniel Lichtblau
Wolfram Research





  • Prev by Date: Re: Exporting data into a file, OpenWrite
  • Next by Date: Re: Help with project needed
  • Previous by thread: Optimization problem
  • Next by thread: Re: Re: Optimization problem