Wykrywanie krawędzi metodą Sobela

Odpowiedz Nowy wątek
2014-12-17 22:29
0
 void Detekcja_krawedzi_metodaSobela(PGM obraz_IN)
{
    PGM obraz_OUT;
    FILE *nowy_plik;
    int i,j;
 
    nowy_plik = fopen(("%s",strcat(obraz_IN.nazwa, "-detekcja krawedzi.pgm")), "w");
 
    strcpy(obraz_OUT.magic_number, obraz_IN.magic_number);
    obraz_OUT.Maxval = obraz_IN.Maxval;
    obraz_OUT.wysokosc = obraz_IN.wysokosc;
    obraz_OUT.szerokosc = obraz_IN.szerokosc;
 
    obraz_OUT.pixel = (int **)malloc(obraz_OUT.wysokosc * sizeof(*obraz_OUT.pixel));
        for (i = 0; i < obraz_OUT.wysokosc; i++)
                obraz_OUT.pixel[i] = (int *)malloc(obraz_OUT.szerokosc * sizeof(**obraz_OUT.pixel));
 
    for(i=0; i < obraz_OUT.wysokosc; i++)
    {
        for(j=0; j < obraz_OUT.szerokosc; j++)
        {
            {
            if(((i > 0) && (i < obraz_IN.wysokosc - 1)) && ( j == 0 ))
                obraz_OUT.pixel[i][j] = obraz_IN.pixel[i-1][j+1] + 2 * obraz_IN.pixel[i][j+1] + obraz_IN.pixel[i+1][j+1];
            else if(((i > 0) && (i < obraz_IN.wysokosc - 1)) && ( j == obraz_IN.szerokosc - 1 ))
                obraz_OUT.pixel[i][j] = -1* (obraz_IN.pixel[i-1][j-1] + 2 * obraz_IN.pixel[i][j-1] + obraz_IN.pixel[i+1][j-1]);
            else if(((j > 0) && (j < obraz_IN.szerokosc - 1)) && ( i == 0 ))
                obraz_OUT.pixel[i][j] = 2 * obraz_IN.pixel[i][j+1] + obraz_IN.pixel[i+1][j+1] - 2 * obraz_IN.pixel[i][j-1] - obraz_IN.pixel[i+1][j-1];
            else if(((j > 0) && (j < obraz_IN.szerokosc - 1)) && ( i == obraz_IN.wysokosc - 1 ))
                obraz_OUT.pixel[i][j] = obraz_IN.pixel[i-1][j+1] + 2 * obraz_IN.pixel[i][j+1] - obraz_IN.pixel[i-1][j-1] - 2 * obraz_IN.pixel[i][j-1];
            else if(i == 0 && j ==0) 
                obraz_OUT.pixel[i][j] = 2 * obraz_IN.pixel[i][j+1] + obraz_IN.pixel[i+1][j+1];
            else if(i == 0 && j == obraz_IN.szerokosc - 1) 
                obraz_OUT.pixel[i][j] = -2 * obraz_IN.pixel[i][j-1] - obraz_IN.pixel[i+1][j-1];
            else if(i == obraz_IN.wysokosc - 1 && j == 0)
                obraz_OUT.pixel[i][j] = obraz_IN.pixel[i-1][j+1] + 2 * obraz_IN.pixel[i][j+1];
            else if(i = obraz_IN.wysokosc - 1 && j == obraz_IN.szerokosc - 1)
                obraz_OUT.pixel[i][j] = -2 * obraz_IN.pixel[i][j-1] - obraz_IN.pixel[i-1][j-1];
            }
 
            obraz_OUT.pixel[i][j] = obraz_IN.pixel[i-1][j-1] + 2 * obraz_IN.pixel[i][j-1] + obraz_IN.pixel[i+1][j-1] - obraz_IN.pixel[i-1][j+1] - 2 * obraz_IN.pixel[i][j+1] - obraz_IN.pixel[i+1][j+1];
        }
    }
 
        fprintf(nowy_plik, "%s\n%d %d\n%d\n", obraz_OUT.magic_number, obraz_OUT.szerokosc, obraz_OUT.wysokosc, obraz_OUT.Maxval);
        for (i = 0; i < obraz_OUT.wysokosc; i++) 
        {
            for (j = 0; j < obraz_OUT.szerokosc; j++) 
            {
                fprintf(nowy_plik, "%d ", obraz_OUT.pixel[i][j]);
            }
            fprintf(nowy_plik, "\n");
        }
 
        Usuniecie_obrazu(obraz_OUT);
 
        fclose(nowy_plik);
}

Witam! W powyższej funkcji muszę mieć, w którymś miejscu błąd merytoryczny. Patrzyłem na funkcję mnóstwo czasu i po prostu nie mogę go znaleźć. Wykorzystanie struktury w funkcji oraz wykorzystanie funkcji w main są raczej poprawne, ponieważ dla prostej operacji odbicia wszystko działa. Strzelam, że coś w pętli się poknociło. Domyślam się też, że jest prostsze wykorzystanie metody Sobela, ale postanowiłem to zrobić najprościej jak krowie na rowie.

Pozostało 580 znaków

2014-12-17 22:37
0

W tym wierszy wyłazisz poza granice tablicy:

obraz_OUT.pixel[i][j] = obraz_IN.pixel[i-1][j-1] + 2 * obraz_IN.pixel[i][j-1] + obraz_IN.pixel[i+1][j-1] - obraz_IN.pixel[i-1][j+1] - 2 * obraz_IN.pixel[i][j+1] - obraz_IN.pixel[i+1][j+1];

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-12-17 22:51
0

A jak wstawiłem te wszystkie instrukcje warunkowe dla brzegów i wierzchołków (razem 8) to jeśli dojdzie do tego wiersza, co mówisz to nie powinno to wystarczyć, żeby ten ostatni wiersz nie powodował tego wyłażenia poza granicę tablicy ?

edytowany 1x, ostatnio: mikric, 2014-12-17 22:56

Pozostało 580 znaków

2014-12-17 22:57
0

A jak tu na forum napiszę "pokój na świecie" to nie wystarczy aby był pokój na świecie?


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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