snn-mean.cl.h 9.36 KB
Newer Older
Victor Oliveira's avatar
Victor Oliveira committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
static const char* snn_mean_cl_source =
"float colordiff (float4 pixA,                                                 \n"
"                 float4 pixB)                                                 \n"
"{                                                                             \n"
"    float4 pix = pixA-pixB;                                                   \n"
"    pix *= pix;                                                               \n"
"    return pix.x+pix.y+pix.z;                                                 \n"
"}                                                                             \n"
"                                                                              \n"
"__kernel void snn_mean (__global const   float4 *src_buf,                     \n"
"                                         int src_width,                       \n"
"                                         int src_height,                      \n"
"                        __global         float4 *dst_buf,                     \n"
"                                         int radius,                          \n"
"                                         int pairs)                           \n"
"{                                                                             \n"
"    int gidx   =get_global_id(0);                                             \n"
"    int gidy   =get_global_id(1);                                             \n"
"    int offset =gidy * get_global_size(0) + gidx;                             \n"
"                                                                              \n"
"    __global const float4 *center_pix=                                        \n"
"        src_buf + ((radius+gidx) + (gidy+radius)* src_width);                 \n"
"    float4 accumulated=0;                                                     \n"
"                                                                              \n"
"    int count=0;                                                              \n"
"    if(pairs==2)                                                              \n"
"    {                                                                         \n"
"        for(int i=-radius;i<0;i++)                                            \n"
"        {                                                                     \n"
"            for(int j=-radius;j<0;j++)                                        \n"
"            {                                                                 \n"
"                __global const float4 *selected_pix = center_pix;             \n"
"                float  best_diff = 1000.0f;                                   \n"
"                                                                              \n"
"                    int xs[4]={                                               \n"
"                        gidx+j+radius, gidx-j+radius,                         \n"
"                        gidx-j+radius, gidx+j+radius                          \n"
"                    };                                                        \n"
"                    int ys[4]={                                               \n"
"                        gidy+i+radius, gidy-i+radius,                         \n"
"                        gidy+i+radius, gidy-i+radius};                        \n"
"                                                                              \n"
"                    for (int k=0;k<4;k++)                                     \n"
"                    {                                                         \n"
"                        if (xs[k] >= 0 && xs[k] < src_width &&                \n"
"                            ys[k] >= 0 && ys[k] < src_height)                 \n"
"                        {                                                     \n"
"                            __global const float4 *tpix =                     \n"
"                                src_buf + (xs[k] + ys[k] * src_width);        \n"
"                            float diff=colordiff(*tpix, *center_pix);         \n"
"                            if (diff < best_diff)                             \n"
"                            {                                                 \n"
"                                best_diff = diff;                             \n"
"                                selected_pix = tpix;                          \n"
"                            }                                                 \n"
"                        }                                                     \n"
"                    }                                                         \n"
"                                                                              \n"
"                accumulated += *selected_pix;                                 \n"
"                                                                              \n"
"                ++count;                                                      \n"
"                if (i==0 && j==0)                                             \n"
"                    break;                                                    \n"
"            }                                                                 \n"
"        }                                                                     \n"
"        dst_buf[offset] = accumulated/count;                                  \n"
"        return;                                                               \n"
"    }                                                                         \n"
"    else if(pairs==1)                                                         \n"
"    {                                                                         \n"
"        for(int i=-radius;i<=0;i++)                                           \n"
"        {                                                                     \n"
"            for(int j=-radius;j<=radius;j++)                                  \n"
"            {                                                                 \n"
"                __global const float4 *selected_pix = center_pix;             \n"
"                float  best_diff = 1000.0f;                                   \n"
"                                                                              \n"
"                /* skip computations for the center pixel */                  \n"
"                if (i != 0 && j != 0)                                         \n"
"                {                                                             \n"
"                    int xs[4]={                                               \n"
"                        gidx+i+radius, gidx-i+radius,                         \n"
"                        gidx-i+radius, gidx+i+radius                          \n"
"                    };                                                        \n"
"                    int ys[4]={                                               \n"
"                        gidy+j+radius, gidy-j+radius,                         \n"
"                        gidy+j+radius, gidy-j+radius                          \n"
"                    };                                                        \n"
"                                                                              \n"
"                    for (i=0;i<2;i++)                                         \n"
"                    {                                                         \n"
"                        if (xs[i] >= 0 && xs[i] < src_width &&                \n"
"                            ys[i] >= 0 && ys[i] < src_height)                 \n"
"                        {                                                     \n"
"                            __global const float4 *tpix =                     \n"
"                                src_buf + (xs[i] + ys[i] * src_width);        \n"
"                            float diff=colordiff (*tpix, *center_pix);        \n"
"                            if (diff < best_diff)                             \n"
"                            {                                                 \n"
"                                best_diff = diff;                             \n"
"                                selected_pix = tpix;                          \n"
"                            }                                                 \n"
"                        }                                                     \n"
"                    }                                                         \n"
"                }                                                             \n"
"                accumulated += *selected_pix;                                 \n"
"                ++count;                                                      \n"
"                if (i==0 && j==0)                                             \n"
"                    break;                                                    \n"
"            }                                                                 \n"
"        }                                                                     \n"
"        dst_buf[offset] = accumulated/count;                                  \n"
"        return;                                                               \n"
"    }                                                                         \n"
"    return;                                                                   \n"
"}                                                                             \n"
;