Przetwarzanie obrazów - pixel po pixelu .

0

Witam. Na wstępie chciałem się przywitać gdyż jest to mój pierwszy post ;)
Obecnie tworzę swój pierwszy większy program, ktory będzie sprawdzał karty odpowiedzi. Do programu ładujemy skan karty odpowiedzi, wykonuje binaryzacje a następnie chce sprawdzać które pixele są zamalowane, a które są puste. Problem w tym, że wczytując plik o wielkości np 500x500px program skanuje go bardzo dlugo (250tys pixeli do sprawdzenia). Zrealizowałem pętle, która skanuje pixele i zapisuje ich kolory do tablicy 2wymiarowej. kod wygląda tak:

Bitmap bitmapa;
            bitmapa = (Bitmap)pictureBox2.Image;
            BitmapData dane = bitmapa.LockBits(
                new Rectangle(0, 0, bitmapa.Width, bitmapa.Height), ImageLockMode.ReadWrite, bitmapa.PixelFormat);
            unsafe
            { //  wskaźnik na pierwszy piksel
                int y = 0, x = 0;
                byte* bitmapaPtr = (byte*)dane.Scan0;
                // padding bitmapy
                int offset = dane.Stride - dane.Width * 3;
                   Bitmap tt;
                tt = (Bitmap)pictureBox4.Image;
                bitmapa.UnlockBits(dane);
                progressBar1.Value = 1;
                for (y = 0; y < bitmapa.Height; y++)
                {
                    for (x = 0; x < bitmapa.Width; x++)
                    {
                        // operacje na pikselu
                         try
                        {
                            rtn = "#" + pixelColor.R.ToString("X2") + pixelColor.G.ToString("X2") + pixelColor.B.ToString("X2");
                            tabl[y, x] = rtn;
                            richTextBox3.Text +=  tabl[y, x] + "\n";
                        }   catch (Exception) { }
                         bitmapaPtr += 3;     // następny piksel
}           bitmapaPtr += offset;           // następny wiersz
} }
 

A teraz pytanie. W jaki sposób sprawdzić pojedyńcze pixele i zapisać ich kolor do tablicy danych. Wiem, że problem wygląda bardzo prosto jednak już od kilku godzin nie potrafię sobię z nim poradzić. Z góry dziękuje za wszelką pomoc. Wszelkie uwagi, komentarze mile widziane. Pozdrawiam Rafał.

0

Jak mamy coś pomóc jeśli nie wiadomo co chcesz zrobić?

0

Super dziękuje za pomoc. Mam już kod, który pobiera dla mnie pożądany pixel:

string[] temp = new string[1000];
                {
                    Color kolor = mapa.GetPixel(10, 10);   // pobiera pixel x=10, y=10;
                    temp[x] = "#" + kolor.R.ToString("X2") + kolor.G.ToString("X2") + kolor.B.ToString("X2"); 
                 x++;
                }

Biorąc pod uwagę, że mam okolo 500px do pobrania, w jaki sposób mogę uniknąć powtarzania tej linijki kodu?

Color kolor = mapa.GetPixel(x, y);  

Dodam , że nie istnieje większa zależność pomiędzy odstępami pobieranych pixeli i na moją logikę, współrzędne każdego pixela muszę podać ręcznie. Macie pomysł jak to rozwiązać?

1

Macie pomysł jak to rozwiązać? Musisz znaleźć jakąś matematyczną zależność.

0

Zmienię szablon karty odpowiedzi, tak aby pola były oddalone od siebie o określoną (stałą) wartość. Tak jak już pisałem wcześniej, mam względnie mała wiedzę a projekt, który muszę wykonać wykracza sporo poza jej obręby ;) Dziękuje raz jeszcze za nakierowanie mnie na właściwą drogę.

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