RGBtoHSV(Func in)1 Halide::Func RGBtoHSV(Func in)
2 {
3 Func out;
4 Var x,y,c;
5 Func minC,maxC,delta;
6 Func h,s,v;
7 minC(x,y) = min(in(x,y,0),min(in(x,y,1),in(x,y,2)));
8 maxC(x,y) = max(in(x,y,0),max(in(x,y,1),in(x,y,2)));
9 v(x,y) = maxC(x,y);
10 delta(x,y) = maxC(x,y) - minC(x,y);
11 s(x,y) = select(maxC(x,y) != 0, delta(x,y)/maxC(x,y), 0);//S
12 h(x,y) = select(maxC(x,y) == in(0,x,y), //R is highest
13 (in(1,x,y) - in(2,x,y))/delta(x,y),
14 select(maxC(x,y) == in(1,x,y), //G is highest
15 2 + (in(2,x,y) - in(0,x,y))/delta(x,y),
16 4 + (in(0,x,y) - in(1,x,y))/delta(x,y)));//B is highest
17 Func hNorm;
18 hNorm(x,y) = select(h(x,y) < 0, 60.0f*h(x,y) + 360.0f, 60.0f*h(x,y));
19 out(x,y,c) = select(c == 0, hNorm(x,y),
20 c == 1, s(x,y),
21 v(x,y));
22 return out;
23 }
24
25