-/**
- *
- * \brief determine les lniv en chaque point de l'image
- * \author zulu - AND
- *
- * \param[in] L Largeur de l'image
- * \param[in] H Hauteur de l'image
- * \param[in] r longueur des segments
- *
- * \param[out] img_out image des lniv
- *
- * Execution sur des blocs de threads 2D et une grille 2D
- * selon les dimensions de l'image.
- * L'image d'entrée doit être au préalable en mémoire texture pointée par "tex_img_estim".
- * Les matrices des chemins sont, elles, pointées par "tex_paths"
- * Cette version ne fournit pas les indices des chemins pour les tracé éventuel des lniv.
- * Cette version tente d'utiliser la shared memory pour compenser la baisse de perf due aux chemins
- * paramétrables non constants.
- */
-
-__global__ void kernel_levelines_texture_smem(unsigned int * img_out, unsigned int L, unsigned int H, unsigned int r)
-{
- // coordonnées du point dans le bloc
- unsigned int iib = threadIdx.x ;
- unsigned int jib = threadIdx.y ;
- // coordonnes du point dans l'image
- unsigned int i = blockIdx.x*blockDim.x + iib ;
- unsigned int j = blockIdx.y*blockDim.y + jib ;
-
- // nb de points par chemin
- int lpath = r ;
- int ic, jc ;
- int idpath, idpix ;
- unsigned int val, mse_cur, mse_min, z, zc ;
- uint2 mse_data ;
-
- //__shared__ unsigned int val_img[16*16] ;
-
- //val_img[jib*16+iib] = tex2D(tex_img_estim, j, i) ;
-
- if((i>=lpath)&&(i<=H-lpath)&&(j>=lpath)&&(j<=L-lpath)){
- z = tex2D(tex_img_estim, j, i) ;
- for( idpath=0; idpath < PSIZE_I ; idpath++) {
- ic = i ;
- jc = j ;
- mse_data.x = z ;
- mse_data.y = z*z ;
- mse_min = mse_data.y - mse_data.x/lpath*mse_data.y ;
- for( idpix=0; idpix < lpath-1 ; idpix++ ) {
- ic += tex2D(tex_paths, idpix, idpath).x ;
- jc += tex2D(tex_paths, idpix, idpath).y ;
- zc = tex2D(tex_img_estim, jc, ic) ;
- mse_data.x += zc ;
- mse_data.y += zc*zc ;
- }
- // critere de selection du chemin ( SUM_(X2) - SUM_(X)2 / lpath )
- // TODO cherchera ameliorer pour vitesse
- mse_cur = ( mse_data.y - ( mse_data.x / lpath ) * mse_data.x ) ;
- if ( mse_cur < mse_min ){
- mse_min = mse_cur ;
- val = mse_data.x ;
- }
- }
- img_out[ i*L + j ] = val / lpath ;
- }
-}
-