Wykrywanie krawędzi metodą Sobela

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.

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];
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 ?

0

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

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