Witam, mam pewien problem ze zmianą koloru pikseli na analizowanej bitmapie. Otóż moim zadaniem jest wyselekcjonowanie z bitmapy zapisanej w 8 bitowej skali szarości pikseli o kolorze zawierającym się w pewnym przedziale, tj powiedzmy od jasnoszarego do białego, a następnie zmiana ich barwy na żółtą, cała reszta pikseli (a więc od jasnoszarego w dół do czarnego) ma przybrać kolor czarny, ot taka swojego rodzaju binaryzacja. Nie miałbym z tym problemu większego, nawet biorąc pod uwagę, że bardzo średnio u mnie z programowaniem, gdyby trzeba było po pikselom o konkretnej barwie zmienić ją na żółtą, nie bardzo natomiast wiem jak się zabrać do problemu, kiedy muszę określić zakres kolorów, w jakim muszą się owe piksele mieścić by kwalifikować je do zmiany koloru. Jak zapisać to w C# korzystając z system.drawing, żeby piksele od jednej danej wartości koloru do drugiej zostały poddane takiej operacji?
Zmiana koloru pikseli na bitmapie
- Rejestracja: dni
- Ostatnio: dni
Przejrzeć dostępne klasy, ich metody. Użyć do tego Intellisense (podpowiadanie w Visual Studio), google, forum, msdn.
ps. jak nie będzie ci odpowiadała wydajonść takiego rozwiązania to szukaj w google pod 'lockbits'.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 8
Rev napisał(a)
Przejrzeć dostępne klasy, ich metody. Użyć do tego Intellisense (podpowiadanie w Visual Studio), google, forum, msdn.
Miło, że założyłeś iż nie przeglądałem dostępnych klas i metod, googlów, forów i msdn. Jak podkreśliłem średnio u mnie z programowaniem i to wszystko nie jest tam dla mnie takie oczywiste, mimo ze jakimś cudem kawał aplikacji wykrywającej obiekty na obrazie z kamery napisałem. Naprawdę, jeśli Twoja pomoc ma się ograniczać do odsyłania zainteresowanych na google, odpuść sobie i nie marnuj swojego cennego czasu eksperta programisty dla takiego początkującego szaraka jak ja. Lepiej dla nas, jak będziemy się sobą mniej nawzajem irytować.
- Rejestracja: dni
- Ostatnio: dni
chodzi Ci o to żeby wybrać piksele na monochromatycznej bitmapie mające jasność od n do m?
Wystarczyłoby, jeśli rozumiem o co Ci chodzi, coś takiego:
for (int x = 0; x < width; x++)
for(int y = 0; y < height; y++)
{
if (bitmap.GetPixel(x, y).R >= minBright && bitmap.GetPixel(x, y).R <= maxBright)
{ bitmap.SetPixel(x, y, Color.Yellow); }
else
{ bitmap.SetPixel(x, y, Color.Black); }
}
Pisałem z pamięci, mogą być drobne błędy.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 8
Dzięki wielkie MSM, właśnie na częścią zestawiania wartości kolorów pobranych pikseli ze skalą jasności się zastanawiałem, wiem teraz jak to powinno wyglądać, problemem jest teraz jednak to, że nazwy MinBright i MaxBright nie są rozpoznawane przez kompilator. Czym one dokładnie są, tj jakimi obiektami, jako co mogę je zadeklarować?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 51
Są to zmienne typu byte określające poziomy szarości w granicach, w których chcesz zmieniać kolor na żółty. Sam musisz określić jakie to są wartości.
Pozdrawiam
Łukasz Gawron
- Rejestracja: dni
- Ostatnio: dni
- Postów: 8
Aha dziękuje za objaśnienie. W sumie jeśli wyznaczyłem sobie jedną granicę powyżej której piksele przybierają kolor żółty, a poniżej kolor czarny wystarczy tylko jeden warunek z wartością większą od minBright. Musiałem jeszcze cały obraz przenieść przed operacją do nowej bitmapy, bo metoda SetPixel nie działa w przypadku obrazów o formacie pikseli indeksowanych, ale później zadziałało już ok :) Szkoda tylko, że odbywa się to tak wolno - prędkość odświeżania obrazu maleje do ok 2-3 klatek na sekundę. Spróbuję zastosować metodę lockbits klasy Bitmap, ewentualnie jeszcze z tym się zgłoszę jak nie wyjdzie. Dzięki za pomoc jeszcze raz.