       Re: Re: Optimization problem

```Adam,

> 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
>>   :
>>
>> //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 #[] <= 355 && 65 <= 100 #[] <= 80 &&
>>        30 <= 100 #[] <= 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[#[], #[], #[]] &,
>>     ImageData[frame], {2}]] // AbsoluteTiming
>>
>> 2.012571 Seconds
>>
>> Any help is highly appreciated.
>>

Map automatically tries to compile the function you specify.

With your first approach, I would recommend using Binarize or ImageApply
for the job, as they could get optimized in further versions:

With[{hmin = 320/359., hmax = 355/359., smin = .65, smax = .8,
bmin = .3, bmax = .75},
Binarize[frame,
hmin <= #[] <= hmax && smin <= #[] <= smax &&
bmin <= #[] <= bmax &]] // AbsoluteTiming

0.212292 s.

A much faster approach is to process the whole 2d arrays at one go using
functions which can operate on them directly:

With[{hmin = 320/359., hmax = 355/359., smin = .65, smax = .8,
bmin = .3, bmax = .75},
Image[Unitize[
Times @@
Clip[#1, #2, {0, 0}] &, {ImageData[frame,
Interleaving -> False], {{hmin, hmax}, {smin, smax}, {bmin,
bmax}}}]], "Bit"]] // AbsoluteTiming

0.088738 s.

Matthias Odisio
Wolfram Research

```

• Prev by Date: Re: Mathematica question about commutativity of multiplication
• Next by Date: Re: Re: Optimization problem
• Previous by thread: Re: Optimization problem
• Next by thread: Re: Re: Re: Optimization problem