Temat: Co to jest LUT?

LUT oznacza Lookup Table (tablica podglądu)
http://pl.wikipedia.org/wiki/Tablicowanie
http://en.wikipedia.org/wiki/Lookup_table

Jeżeli mamy za zadanie przetworzyć obraz w ten sposób, że wartość każdego z pikseli chcemy przeliczyć według określonego wzoru (podczas potęgowania, logarytmowania itp.), to przy rozmiarze na przykład 3000x3000 pikseli, wzór ten będzie musiał być obliczony 9 milionów razy i za każdym razem wynik będzie wstawiany do tablicy pikseli.

Wiemy jednak, że wejściowe wartości brane do obliczeń zawierają się w znanym nam zakresie - piksele mogą przyjmować wartości całkowite od 0 do skali szarości.

Dlatego w celu optymalizacji czasu wykonania przetwarzania, możemy sobie przygotować dodatkową tablicę, o liczbie elementów równej liczbie możliwych wartości na wejściu (na przykład dla skali szarości 255 będzie to 256 elementów).

W każdej komórce tablicy wpisujemy wynik przeliczania naszego wzoru dla poszczególnych wartości pikseli:

lut[i] = funkcja(i);

Następnie podczas przetwarzania obrazu już nic nie obliczamy, tylko wstawiamy do tablicy pikseli wartości z tablicy LUT.

Stosując to rozwiązanie, zajęliśmy dodatkowe miejsce w pamięci, ale dzięki temu nasz wzór przeliczany był tylko 256, a nie 9 milionów razy.

Aby funkcja przetwarzająca obraz w ten sposób była jak najbardziej uniwersalna i mogła działać dla różnych tablic LUT, warto ją napisać w ten sposób, aby tablica LUT była przekazywana jako argument wywołania funkcji, na przykład:

przetwarzaj_obraz_LUT(struct Obraz* o, int* lut);