Redukcja poziomów szarości

Redukcja poziomów szarości jest banalnie prosta dla wszelkich obrazów i ma złożoność w * h. Otóż bierzemy sobie
piksele z obrazka i….

// pixele to jedna dluga tablica wszystkich pikseli z obrazka
for (int i = 0; i < (w * h); i++) {
    tmp = ((pixele[i] >> 16) & 0xff) +
          ((pixele[i] >> 8) & 0xff) +
          (pixele[i] & 0xff))/3;
    tmp = ((int) (tmp / (256 / skala))) *
          (255 / (skala - 1));
    pixele[i] = (((255 & 0xff) << 24) |
                (((int) tmp & 0xff) << 16) |
                (((int) tmp & 0xff) << 8) |
                ((int) tmp & 0xff));
}

Zmienna skala może być równa od 2 do 256. Oczywiście najlepsze rezultaty otrzymamy jeśli wybierzemy 2, 4, 8, 16, 32, 64, 128 lub nawet 256. Wybranie 2 spowoduje że otrzymamy zbinaryzowany obrazek, zaś gdy wybierzemy 2 to z obrazka kolorowego powstanie obrazek w skali szarości. Proste, no nie?

A oto przykłady: