Mediana dla pliku BMP

0

Wszystko sie kompiluje tylko zapisany "poprawiony" obraz jest caly rozmyty. Siedze nad tym z 6 godzin i nie wiem co jest nie tak.
W tej podwojnej petli porownywane sa najpierw R 9 pikseli w kwadracie 3x3 p otem G a potem B , nastepnie przechodzi do kolejnego pixela.

int a = pointer2->width;
int b = pointer2->height;
int c = a*3;
int padding=0; 
if (c%4==0)
   padding =0;
if (c%4==1)
   padding =3;
if (c%4==2)
   padding =2;
if (c%4==3)
   padding =1;
int tab[9];
printf(" padding:%d\n",padding);
printf(" a:%d\n",a);
printf(" b:%d\n",b);
for(int j=1;j<b-1;j++)
{
     for(int i = j*(a*3 +padding) + 3; i< j*(a*3+padding)+(a*3+padding)-padding-3;i++) // j w srodku
     {     
        tab[0] = pointer3->pixel_data[i-(a*3+padding)-3];
        tab[1] = pointer3->pixel_data[i-(a*3+padding)];
        tab[2] = pointer3->pixel_data[i-(a*3+padding)+3];
        tab[3] = pointer3->pixel_data[i-3];
        tab[4] = pointer3->pixel_data[i];
        tab[5] = pointer3->pixel_data[i+3];
        tab[6] = pointer3->pixel_data[i+(a*padding)-3];
        tab[7] = pointer3->pixel_data[i+(a*padding)];
        tab[8] = pointer3->pixel_data[i+(a*padding)+3];
 //       for(int i=0 ; i<9;i++)
 //       printf("%d ",tab[i]);
//    printf("\n");
        int swap;
        for (int c = 0 ; c < 9; c++)
        {
            for (int d = 0 ; d < 8 - c ; d++)
            {
               if (tab[d] > tab[d+1]) 
               {
                   swap = tab[d];
                   tab[d]   = tab[d+1];
                   tab[d+1] = swap;
               }
            }
        }
  pointer3->pixel_data[i] = tab[4];
    
   //  for(int i=0 ; i<9;i++)
  //      printf("%d ",tab[i]);
  //  printf("\n");
     } 
}
1

Po prostu nadpisujesz sobie dane zanim skończysz przeliczania.
Każda kolejna iteracja ma wpływ na wyniki w kolejnej iteracji.

Obliczona mediana powinna wylądować w nowej bitmapie a nie w starej.

Offtopic: dziel kod na małe funkcje, żeby dało się to czytać (nie przejmuj się tym, że małe funkcje mogą negatywnie się odbić na wydajności, bo kompilator i tak sam ci wszystko zwinie do jednej funkcji jeśli będzie to miało sens).

0

Ok. To ma sens. Zaraz poprawie. A na funkcje podziele ja mi zacznie dzialac. :)

1
dandon223 napisał(a):

A na funkcje podziele ja mi zacznie dzialac. :)

Wleję benzynę jak silnik zapali.

0

Ok. Wiec poprawilem . Jest lepiej, zrobilem tez z niej funkcje. Tylko ze nadal powstaja takie naloty zielono niebieskie. Zastanawiam sie czy to nie wynika z faktu ze wzialem zdjecie z internetu i moze byc slabej jakosci. Specjalnie wybralem z uszkodzeniami ktore niby powinny zostac w wiekszej czesci polepszone przez ten filtr. Moze po prostu cos jeszcze nie jest tak.

void mediana_24_3x3(struct InfoHeader *pointer2,struct data*pointer3,struct data*pointer4)
{

    int a = pointer2->width;
    int b = pointer2->height;
    int c = a*3;
    int padding=0; 
    if (c%4==0)
        padding =0;
    if (c%4==1)
        padding =3;
    if (c%4==2)
        padding =2;
    if (c%4==3)
        padding =1;
    
    int tab[9];
    
    for(int j=1;j<b-1;j++)
    {
        for(int i = j*(a*3 +padding) + 3; i< j*(a*3+padding)+(a*3+padding)-padding-3;i++)
        {
            tab[0] = pointer3->pixel_data[i-(a*3+padding)-3];
            tab[1] = pointer3->pixel_data[i-(a*3+padding)];
            tab[2] = pointer3->pixel_data[i-(a*3+padding)+3];
            tab[3] = pointer3->pixel_data[i-3];
            tab[4] = pointer3->pixel_data[i];
            tab[5] = pointer3->pixel_data[i+3];
            tab[6] = pointer3->pixel_data[i+(a*padding)-3];
            tab[7] = pointer3->pixel_data[i+(a*padding)];
            tab[8] = pointer3->pixel_data[i+(a*padding)+3];
            int swap;
            
            for (int c = 0 ; c < 9; c++)
            {
                for (int d = 0 ; d < 8 - c ; d++)
                {
                    if (tab[d] > tab[d+1]) 
                    {
                        swap = tab[d];
                        tab[d]   = tab[d+1];
                        tab[d+1] = swap;
                    }
                }
            }
            pointer4->pixel_data[i] = tab[4];
        }
    }
}


1 użytkowników online, w tym zalogowanych: 0, gości: 1