Witam
Mam za zadanie napisać algorytm Filtru splotowego.
Wzorowałem się na artykule z pewnego blogu, jest tam również przykładowy kod lecz C# nie umiem za dobrze więc napisałem swój własny algorytm w oparciu o tekst.
http://dikamilo.net/entry/filtry-splotowe-w-c-sharp/
Mój problem polega na tym że dla danych wartości w masce algorytm albo rozmywa albo wyostrza prawie zawsze w ten sam sposób. Tak jak by wartości w masce nie miały większego znaczenia. Przykładowe wypełnienia maski na dole artykułu nie działają niestety u mnie...
Algorytm jeszcze bez warunków brzegowych dlatego te 20 w petlach.
Algorytm trzeba wykonać dla wszystkich pixeli obrazka i jak i składowych RGB.
tab[][] - maska.
r2 - promień maski (dla 3x3 maski = 1, dla 5x5 = 2 itd....)
clamp() - zaokrągla wartości do przedziału 0-255.
void Splot::maska(QImage *img)
{
QImage img_copy = *img;
uchar *p = 0;
for(int y=20; y<img->height()-20; ++y)
{
for(int x=20; x<4*img->width()-20; x+=4)
{
double sumaX = 0;
double suma_mnozenia_R = 0,
suma_mnozenia_G = 0,
suma_mnozenia_B = 0;
int a = -1,b = -1;
for (int j = y-r2; j< y+r2; j++)
{
p = img_copy.scanLine(j);
b++;
for (int i = x-r2*4; i< x+r2*4; i+=4)
{
a++;
sumaX += tab[a][b];
suma_mnozenia_R += p[2+i] * tab[a][b];
suma_mnozenia_G += p[1+i] * tab[a][b];
suma_mnozenia_B += p[i] * tab[a][b];
}
}
if (sumaX == 0)
continue;
else
{
p = img->scanLine(y);
p[x+2] = clamp(suma_mnozenia_R / sumaX,0,255);
p[x+1] = clamp(suma_mnozenia_G / sumaX,0,255);
p[x ] = clamp(suma_mnozenia_B / sumaX,0,255);
}
}
}
}
Wartości do maski wczytuje z QTableWidget - działa to 100%.
Cała reszta też powinna działać prawidłowo, problem jest raczej z tym algorytmem.