artykuły

Delphi - Transformacje grafiki - Odcienie szarości

15:55
sob, 12 marzec 2005
Tekst przedstawia sposób na przetworzenie obrazów kolorowych do odcieni szarości. W jasny i przystępny dla każdego sposób obrazuje tworzenie filtra graficznego odpowiedzialnego za ten efekt.

Wstęp

Transformacje grafiki - temat woda. Dziś postanowiłem opisać metodę zamiany kolorowego obrazka na odcienie szarości. Efekt bardzo prosty zarówno do wykonania, jak i do zrozumienia. Tyle słowem wstępu - zacznijmy więc.

Obrazek pierwotny > Obrazek w odcieniach szarości

Piszemy program

Obróbka kosmetyczna

  1. Uruchomcie Delphi'ego.
  2. Z palety Additional wybierz komponent Image i połóż go na formie. Zaznacz go pojedynczym kliknięciem i przejdź do Inspektora Obiektów (F11). Odszukaj właściwość Align i ustaw ją na "alClient".
  3. Przejdź do palety Dialogs, odszukaj komponent OpenPictureDialog i połóż go na formularzu.
  4. Wybierz z palety Standard przycisk (Button) i połóż go na formie. Zaznacz go pojedynczym kliknięciem i przejdź do Inspektora Obiektów. Odszukaj w nim właściwość Caption. Zmień jej wartość na "Otwórz obrazek".

Obróbka pisemna

  1. Dwukrotnie kliknij na przycisk. Otworzy się okno Edytora Kodu, który czeka na nas z nowo wygenerowaną procedurą. W procedurze, przed słówkiem begin piszemy: var x, y : integer; r,g,b : byte; kolor : TColor; srednia : byte; po słówku begin wpisujemy natomiast: if not OpenPictureDialog1.Execute Then Exit; Powyższy warunek otwiera okno wyboru pliku i zakańcza procedurę jeśli użytkownik nie wybrał żadnego pliku (np. kliknął na Anuluj). Zapobiega to wczytaniu pustej ścieżki.Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);Zadaniem powyższej instrukcji jest wczytanie do komponentu Image1 pliku wybranego przez użytkownika (OpenPictureDialog1.FileName).For y:=0 To Image1.Picture.Height-1 Do beginPowyższa pętla "przechodzi" przez wszystkie wiersza (linie) obrazka. Jest wykonywana od linii 0 do wartości wysokości obrazka.for x:=0 To Image1.Picture.Width-1 do beginKolejna pętla, która "przechodzi" przez wszystkie piksele danego wiersza. Jest wykonywana od 0 do wartości szerokości obrazka.kolor := Image1.Picture.Bitmap.Canvas.Pixels[x,y];Wyżej następuje pobranie koloru aktualnie "przerabianego" piksela i przypisanie go do zmiennej kolor. r := GetRValue(kolor); g := GetGValue(kolor); b := GetBValue(kolor); Powyżej znajdują się instrukcje odpowiedzialne za rozłożenie pobranego koloru na trzy składowe r,g,b.srednia := Round((r+g+b) / 3);Powyżej następuje obliczanie średniej trzech składowych. Image1.Picture.Bitmap.Canvas.Pixels[x,y] := RGB(srednia, srednia, srednia); end; end; Wyżej następuje narysowanie piksela, którego kolor stanowi obliczona wcześniej średnia. Zawsze kolor w odcieniach szarości uzyskujemy tylko wtedy, gdy wszystkie składowe RGB mają tę samą wartość. Możemy więc napisać coś takiego:Image1.Picture.Bitmap.Canvas.Pixels[x,y] := RGB(r, r, r);Ale będą to odcienie szarości, nie danego koloru, ale jedynie jego czerwonego widma. Tak samo możemy zrobić odcienie szarości zielonego czy niebieskiego widma:Image1.Picture.Bitmap.Canvas.Pixels[x,y] := RGB(g, g, g);Odcienie szarości poszczególnych części widma różnią się od siebie. Przygotowałem dla was animacje, która ukazuje po kolei odcienie szarości poszczególnych części widma R,G,B.
    Animacja odcieni szarości oddzielnie dla każdego z kanałów
    Aby uzyskać jednolity obraz, należy połączyć odcienie szarości dla poszczególnych składowych w jeden odcień poprzez obliczenie średniej składowych. Jednak operacja ta pozbawia nas możliwości przywrócenia kolorów tak spreparowanemu zdjęciu (czyli pokolorowania go), gdyż ilość informacji o kolorach zanika.

Zakończenie

Jak widać pod pojęciem odcieni szarości kryje się wiele. Nasz filtr może zwracać odcienie szarości obliczone dla wszystkich składowych (uniwersalne), lub tylko dla jednej z nich. W tym drugim wypadku odcienie szarości będą zależeć od składowej dla której sporządzamy obraz. Na powyższej animacji (na klatce która ukazuje odcienie szarości dla koloru czerwonego), możemy zwrócić uwagę, że obiekty najbardziej czerwone są koloru białego. Analogicznie sprawa wyglądałaby gdybyśmy sporządzili odcienie szarości dla niebieskiej części widma. Wówczas obiekty najbardziej niebieskie byłyby białe.
Kod źródłowy, zawarty w tym artykule został maksymalnie uproszczony, tak aby jak najwyraźniej widoczna była logika jego działania. Jeśli chciałbyś przyśpieszyć swój kod kilkudziesięciokrotnie bądź sprawić aby obsługiwał on format JPEG powinieneś zapoznać się z artykułem "Delphi - Transformacje grafiki - Przyjaśnianie i przyciemnianie" (w którym opisałem dużo szybszą metodę operacji na obrazach) oraz z poniższym załącznikiem.
Jak zwykle do artykułu dołączam kod źródłowy pisanej aplikacji (jednocześnie, przygotowałem wersję obsługującą format JPEG). Życzę wszystkim sukcesów w tworzeniu własnych efektów.

Źródła: - obrazki zaczerpnięte z nieprzeniknionych zasobów internetu ;)
12345
Delphi - Transformacje grafiki - Odcienie szarości Autor opinii: Czytelnicy, data przesłania: 0

Podobne artykuly:

Skomentuj

Aby zamieścić komentarz, proszę włączyć JavaScript - niestety roboty spamujące dają mi niezmiernie popalić.






Komentarze czytelników

    • oceaner
    • nie, 28 listopad 2010, 15:21
    • Super dzięki.
    • oceaner
    • sob, 27 listopad 2010, 21:17
    • Trochę nie działa to przejście z koloru na odcienie szarości ,nie wczytuje wszystkich rozszerzeń, no i nie zmienia obrazu, możesz obadać.




      Odp: Działa, ale przykład był pisany pod format BMP, aby maksymalnie uprościć kod i zostawić samą logikę. Napisałem kolejny przykład, dołączam go do artykułu.
Dexter