Repository for OpenCV's extra modules
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

39 lines
1.2 KiB

__kernel void anisodiff(__global const uchar * srcptr, int srcstep, int srcoffset,
__global uchar * dstptr, int dststep, int dstoffset,
int rows, int cols, __constant float* exptab, float alpha)
{
int x = get_global_id(0);
int y = get_global_id(1);
if( x < cols && y < rows )
{
int yofs = y*dststep + x*3;
int xofs = y*srcstep + x*3;
float4 s = 0.f;
float4 c = (float4)(srcptr[xofs], srcptr[xofs+1], srcptr[xofs+2], 0.f);
float4 delta, adelta;
float w;
#define UPDATE_SUM(xofs1) \
delta = (float4)(srcptr[xofs + xofs1], srcptr[xofs + xofs1 + 1], srcptr[xofs + xofs1 + 2], 0.f) - c; \
adelta = fabs(delta); \
w = exptab[convert_int(adelta.x + adelta.y + adelta.z)]; \
s += delta*w
UPDATE_SUM(3);
UPDATE_SUM(-3);
UPDATE_SUM(-srcstep-3);
UPDATE_SUM(-srcstep);
UPDATE_SUM(-srcstep+3);
UPDATE_SUM(srcstep-3);
UPDATE_SUM(srcstep);
UPDATE_SUM(srcstep+3);
s = s*alpha + c;
uchar4 d = convert_uchar4_sat(convert_int4_rte(s));
dstptr[yofs] = d.x;
dstptr[yofs+1] = d.y;
dstptr[yofs+2] = d.z;
}
}