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:
- sąsiednie piksele nie mają wpływu na aktualizowany piksel
- ujemne wartości jasności są 'przycinane' do 0
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].
staticvoid Przyciemnij(ref int[,] obrazek, int zmiana)
{
for (int y = 0; y < obrazek.GetLength(0); y++)
{
for (int x = 0; x < obrazek.GetLength(1); x++)
{
if (obrazek[y, x] >= zmiana)
{
obrazek[y, x] -= zmiana;
}
else
{
obrazek[y, x] = 0;
}
}
}
}
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.