Strona główna » Algorytmy » Artykuły » Przyciemnianie
 

Przyciemnianie

Cel

Przyciemnianie obrazu polega na zmianie jasności jego pikseli w kierunku wartości zero. Podczas takiej operacji mogą wystąpić takie problemy jak ujemna wartość jasności co nie jest możliwe z punktu obrazka.

Cechy

Operacja przyciemniania jest:

Przykład

Poniżej zostało przedstawione przykładowe zdjęcie. Przy pomocy przycisków można rozpocząć proces jego pociemniania. W celu przywrócenia początkowego obrazka wystarczy kliknąć 'załaduj obrazek ponownie'.

Implementacja

Funkcja realizująca pociemnianie przyjmuje jeden argument zmiana, który określa o ile ma zostać zmieniona jasność. Przyjmując, że zdjęcie jest w skali szarości, a każdy piksel zajmuje dokładnie jeden bajt to możliwe wartości są z przedziału [1, 255].

  1. static void Przyciemnij(ref int[,] obrazek, int zmiana)
  2. {
  3. for (int y = 0; y < obrazek.GetLength(0); y++)
  4. {
  5. for (int x = 0; x < obrazek.GetLength(1); x++)
  6. {
  7. if (obrazek[y, x] >= zmiana)
  8. {
  9. obrazek[y, x] -= zmiana;
  10. }
  11. else
  12. {
  13. obrazek[y, x] = 0;
  14. }
  15. }
  16. }
  17. }

Krytyczne jest wychwycenie wszystkich pikseli, których jasność wyszłaby ujemna. W takich przypadkach należy przypisać wartość 0, ponieważ jest to najmniejsza możliwa wartość bajtu. Jeśli taka operacja zachodzi to pociemnianie jest nieodwracalne. (Chyba, że istnieje możliwość cofnięcia w programie np. Ctrl+Z)

Testowanie funkcji

Działanie napisanej funkcji można sprawdzić przy pomocy poniższego fragmentu kodu, który wczytuje macierz reprezentującą obrazek, a następnie wypisuje taką macierz po zmniejszeniu jasności pikseli.

  1. static void Main(string[] args)
  2. {
  3. int szer, wys, zmiana;
  4. Console.WriteLine("Podaj rozmiar obrazka szer x wys:");
  5. string[] data = Console.ReadLine().Split(' ');
  6. szer = Convert.ToInt32(data[0]);
  7. wys = Convert.ToInt32(data[1]);
  8. Console.WriteLine("Podaj wartości tablicy:");
  9. int[,] obrazek = new int[wys, szer];
  10. for (int y = 0; y < obrazek.GetLength(0); y++)
  11. {
  12. data = Console.ReadLine().Split(' ');
  13. for (int x = 0; x < obrazek.GetLength(1); x++)
  14. {
  15. obrazek[y, x] = Convert.ToInt32(data[x]);
  16. }
  17. }
  18. Console.WriteLine("Podaj wartość przyciemnienia:");
  19. zmiana = Convert.ToInt32(Console.ReadLine());
  20. Przyciemnij(ref obrazek, zmiana);
  21. Console.WriteLine("Po zmianie otrzymujemy:");
  22. for (int y = 0; y < obrazek.GetLength(0); y++)
  23. {
  24. for (int x = 0; x < obrazek.GetLength(1); x++)
  25. {
  26. Console.Write("{0} ", obrazek[y, x]);
  27. }
  28. Console.WriteLine();
  29. }
  30. Console.ReadKey();
  31. }