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. void Przyciemnij(int ** obrazek, int szer, int wys, int zmiana) {
  2.   for (int y = 0; y < wys; y++) {
  3.     for (int x = 0; x < szer; x++) {
  4.       if (obrazek[y][x] >= zmiana) {
  5.         obrazek[y][x] -= zmiana;
  6.       } else {
  7.         obrazek[y][x] = 0;
  8.       }
  9.     }
  10.   }
  11. }

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. int main() {
  2.   int szer, wys, zmiana;
  3.   cout << "Podaj rozmiar obrazka szer x wys:\n";
  4.   cin >> szer >> wys;
  5.   cout << "Podaj wartosci tablicy:\n";
  6.   int ** obrazek = new int *[szer];
  7.   for (int y = 0; y < wys; y++) {
  8.     obrazek[y] = new int[wys];
  9.     for (int x = 0; x < szer; x++) {
  10.       cin >> obrazek[y][x];
  11.     }
  12.   }
  13.   cout << "Podaj wartosc przyciemnienia:\n";
  14.   cin >> zmiana;
  15.   Przyciemnij(obrazek, szer, wys, zmiana);
  16.   cout << "Po zmianie otrzymujemy:" << endl;
  17.   for (int y = 0; y < wys; y++) {
  18.     for (int x = 0; x < szer; x++) {
  19.       cout << obrazek[y][x] << " ";
  20.     }
  21.     cout << endl;
  22.   }
  23.   system("pause");
  24.   return 0;
  25. }