Bonjour,
j ai besoin de votre aide. J' ai reussi a optimiser mon code et de diminuer un peu le nombre de cycles lors de l execution. Ce code permet de lire les images et de les modifies en utilisant la methode ELA de-interlacing.
Maintenant, j ai une partie ou l image est traite pixel par pixel, j aimerai bien votre aide afin de la modifie et de la traite par 4 pixels.
/* img_out initialization */
img_out = (pix_type**)malloc(sizeof(pix_type*)*frame_height);
for(j=0; j<frame_height; j++)
{
img_out[j] = (pix_type*)malloc(sizeof(pix_type)*img_width);
if (field_test == true)
{
field_test = false;
for(i=0; i<img_width; i++)
img_out[j][i] = img_in[ptr_j][i+2];
}
else
{
field_test = true;
for(i=0; i<img_width; i++)
img_out[j][i] = calculate_out(&img_in[ptr_j][i],&img_in[ptr_j+1][i]);
ptr_j++;
}
}
return img_out;
}
#ifdef TEST2
pix_type calculate_out(pix_type line_buf_up[],pix_type line_buf_down[])
{
int dir_dif[5];
pix_type ptr_up, ptr_down;
float interpolated_val;
bool dominant = false;
int D_d1, D_d2, smallest;
pix_type img_out;
int itr;
pix_type tmp_val;
#ifdef PARAMETER_VERTICAL_THRESHOLD_OPTIMIZATION
/* // Optimization variable */
Parameter vertical_threshold("T_v", MIN_V_T, MAX_V_T, V_T_MIN_STEP);
int T_v = (int)vertical_threshold;
#else
int T_v = PARAM_VERTICAL_THRESHOLD;
#endif
#ifdef PARAMETER_DISTANCE_THRESHOLD_OPTIMIZATION
/* // Optimization variable */
Parameter distance_threshold("T_d", MIN_D_T, MAX_D_T, D_T_MIN_STEP);
int T_d = (int)distance_threshold;
#else
int T_d = PARAM_DISTANCE_THRESHOLD;
#endif
dir_dif[0] = abs(line_buf_up[0] - line_buf_down[4]);
dir_dif[1] = abs(line_buf_up[1] - line_buf_down[3]);
dir_dif[2] = abs(line_buf_up[2] - line_buf_down[2]);
dir_dif[3] = abs(line_buf_up[3] - line_buf_down[1]);
dir_dif[4] = abs(line_buf_up[4] - line_buf_down[0]);
if(dir_dif[2] < T_v)
{
ptr_up = 2;
ptr_down = 2;
dominant = false;
}
else
{
smallest=smallfun2(dir_dif);
switch(smallest){
case 0:
D_d1 = abs(dir_dif[0] - dir_dif[3]);
D_d2 = abs(dir_dif[0] - dir_dif[4]);
ptr_up = 0;
ptr_down = 4;
if(D_d1 > T_d && D_d2 > T_d) dominant = true;
else dominant = false;
break;
case 1:
D_d1 = abs(dir_dif[1] - dir_dif[3]);
D_d2 = abs(dir_dif[1] - dir_dif[4]);
ptr_up = 1;
ptr_down = 3;
if(D_d1 > T_d && D_d2 > T_d) dominant = true;
else dominant = false;
break;
case 2:
ptr_up = 2;
ptr_down = 2;
dominant = false;
break;
case 3:
D_d1 = abs(dir_dif[3] - dir_dif[0]);
D_d2 = abs(dir_dif[3] - dir_dif[1]);
ptr_up = 3;
ptr_down = 1;
if(D_d1 > T_d && D_d2 > T_d) dominant = true;
else dominant = false;
break;
case 4:
D_d1 = abs(dir_dif[4] - dir_dif[0]);
D_d2 = abs(dir_dif[4] - dir_dif[1]);
ptr_up = 4;
ptr_down = 0;
if(D_d1 > T_d && D_d2 > T_d) dominant = true;
else dominant = false;
break;
default:
break;
}
}
interpolated_val = ((float)(line_buf_up[ptr_up] + line_buf_down[ptr_down])) / 2;
if(dominant)
img_out = medianfun(line_buf_up[2],line_buf_down[2],(int)interpolated_val);
else
img_out = (int)interpolated_val;
return img_out;
}
#endifTous ca c pour un pixel, j aimerai bien modifier la fontion ecrite en italique, gras pour la rendre en 4 pixels.
Merci de votre aide.
salut.