# Wykrywanie krawędzi metodą Sobela

2014-12-17 22:29
##### mikric
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
##### _13th_Dragon
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
##### mikric
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
##### _13th_Dragon
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

Liczba odpowiedzi na stronę