C# 3x3 filter image processing (potrzebna pomoc)

0

Witam,
mam mały problem z przetwarzaniem pliku graficznego. Chcę zastosować filtr 3x3 (obojętne wartości macierzy) ale coś nie działa poprawnie (otrzymuje albo obraz czarny albo bardzo rozjaśniony, filtry w ogóle nie działają).
Kod(same dodawanie maski + edycja obrazu):

double[,] mask = new double[,] {{-1,-1,-1},
                                {-1, 9,-1}, 
                                {-1,-1,-1}};
              
            int[] result = new int[3]; //tablica kolorów RGB result[0]=R, result[1]=G,  result[2]=B
            double factor = 1.0;
            double bias = 0.0; 
            
            Bitmap img = new Bitmap(pictureBox1.Image);

            for (int a = 1; a < newBitmap.Width-1; a++) //przechodze po szerokosci obrazka
            {
                for (int b = 1; b < newBitmap.Height-1; b++)//przechodze po wysokosci obrazka
                {
                          double red = 0.0; 
                          double green = 0.0;
                          double blue = 0.0;

                    Color originalColor2 = newBitmap.GetPixel(a, b); //przechwytuje kolor pixela
                    for (int x = 0; x < 3; x++) //czytam macierz po "x"
                    {
                        for (int y = 0; y < 3; y++) //czytam macierz po "y"
                        {
                             red += originalColor2.R * mask[x,y];
                             green += originalColor2.G * mask[x,y];
                             blue += originalColor2.B * mask[x,y]; 
                         }
                    }
                    result[0] = Math.Min(Math.Max((int)(factor * red + bias), 0), 255);  //sprawdzam czy mieszczę sie w zakresie <0.255>
                    result[1] = Math.Min(Math.Max((int)(factor * green + bias), 0), 255);  //sprawdzam czy mieszczę sie w zakresie <0.255> 
                    result[2] = Math.Min(Math.Max((int)(factor * blue + bias), 0), 255);  //sprawdzam czy mieszczę sie w zakresie <0.255>

                    Color newColor2 = Color.FromArgb(result[0], result[1], result[2]);  //tworzę nowy kolor 
                    img.SetPixel(a, b, newColor2);  // ustawiam nową wartość pixela
                    pictureBox3.Image = img;  //wyswietlam obraz
                }
          }              

nie wiem gdzie może być ewentualny błąd (oparłem się na informacjach i kodzie ze strony http://www.algorytm.org/przetwarzanie-obrazow/filtrowanie-obrazow.html) (VisualStudio2013 c#)

Proszę o pomoc.

0

Czesc,
Tak przegladalem link, ktory podales i chyba maske troche bym zmienil (na cos co nie wszedzie ma -1 ;)). Ale w tym konkretnym temacie tez jestem laik.
Moze jeden z tutoriali? Pelno w necie... (http://www.codeproject.com/Articles/2008/Image-Processing-for-Dummies-with-C-and-GDI-Part) i na stack overflow to tez czesty temat.
Pozdro

0

W Javie, ale chyba nie ma za dużo do zmienienia:

import android.graphics.Bitmap;
import android.graphics.Color;

public class ConvolutionFilter {

    public Bitmap apply_Mask(int[] mask, Bitmap image) {
        int c;
        Bitmap preview;
        Bitmap preview=Bitmap.createBitmap(image);

         int r=0;
         int g=0;
         int b=0;

         int weight=0;
         int weightSum=0;
         int counter=0;

         for (int i = 0; i < mask.length; i++)
         {
             weightSum += (int)mask[i];
         }

         for (int i = 0; i < (image.getWidth()-1); i++)
         {
             for (int j = 0; j < (image.getHeight()-1); j++)
             {
                 r = g = b = 0;
                 counter = 0;

                  for (int o = i - 1; o <= i + 1; o++)
                 {
                     for (int p = j - 1; p <= j + 1; p++)
                     {
                         if ((o == -1 && (p == -1 || p == image.getHeight())) || (o == image.getWidth() && (p == -1 || p == image.getHeight())))
                             c = image.getPixel(i, j);
                         else if (o == -1 || o == image.getWidth())
                             c = image.getPixel(i, p);
                         else if (p == -1 || p == image.getHeight())
                             c = image.getPixel(o, j);
                         else
                             c = image.getPixel(o, p);

                         weight = (int)mask[counter];

                         r += ( Color.red(c)* weight);
                         b += (Color.blue(c) * weight);
                         g += (Color.green(c) * weight);

                         counter++;
                     }
                 }
                 if (weightSum == 0)
                     weightSum = 1;
                 r = r / weightSum;
                 b = b / weightSum;
                 g = g / weightSum;

                 if (r < 0)
                     r = 0;
                 if (r > 255)
                     r = 255;

                 if (b < 0)
                     b = 0;
                 if (b > 255)
                     b = 255;

                 if (g < 0)
                     g = 0;
                 if (g > 255)
                     g = 255;



                 preview.setPixel(i, j, Color.rgb(r, g, b));


             }

         }
         return preview;
    }
} 

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