Re: Re: Optimization problem
- To: mathgroup at smc.vnet.net
- Subject: [mg96722] Re: [mg96705] Re: [mg96675] Optimization problem
- From: Adam Simpson <adambsimpson at gmail.com>
- Date: Sun, 22 Feb 2009 03:12:17 -0500 (EST)
- References: <200902201046.FAA17890@smc.vnet.net> <200902220040.TAA08474@smc.vnet.net>
Thanks, but upon running the two functions you supplied I got pretty much the same times as the slower original function. ~2 seconds compared to ~.2 seconds when the If statement is directly inside of Map[]. On Feb 21, 2009, at 7:40 PM, Daniel Lichtblau wrote: > 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 > > > >
- References:
- Optimization problem
- From: Adam Simpson <adambsimpson@gmail.com>
- Re: Optimization problem
- From: Daniel Lichtblau <danl@wolfram.com>
- Optimization problem