Drukarka, czyli kłamstwa Twoich oczu

23.11.2009 - Krzysztof Dryś
TrudnośćTrudność

Te obrazki wyglądają dużo lepiej niż poprzednie. Co prawda ciągle pozostawiają wiele do życzenia, ale widać znaczną poprawę. Okazało się, że szum może być przydatny. W ten sposób zbudowaliśmy drugi algorytm:

1
2
3
4
5
6
7
8
9
10
11
U = obrazek wejściowy
T = obrazek z szumem
d = parametr szumu
p = parametr algorytmu
Dla i = 1...n
 Dla j = 1..m
  T[i,j] = U[i,j] + kostka(d)
  Jeżeli T[i,j] > p
   T[i,j] = 255
  W przeciwnym razie:
   T[i,j] = 0 

Ten algorytm ciągle nie daje zadowalających wyników. Ale po pierwsze jest lepiej niż było. A po drugie znaleźliśmy ciekawe zastosowanie dla szumów.

Dlaczego poprzedni algorytm działa? Dlatego, że ludzkie oko nie umie rozróżniać pojedynczych pikseli. Zamiast tego widzimy średni kolor pikseli na większym obszarze. Dodanie szumu pozwala na wykorzystanie tego efektu.

alternative text Obrazek składający się z ułożonych naprzemian białych i czarnych pikseli. Jako, że nasze oko nie umie rozróżnić pikseli, zamiast pojedynczych kropek widzimy szarą powierzchnię.

Propagacja błędu

Niestety, tytuły w tym artykule nie należą do przyjemnych dla ucha. Ale na szczęście również ta metoda jest prosta w swej istocie.

Zobaczyliśmy, że nasze oko widzi średni kolor pikseli a nie pojedyncze piksele. Postarajmy się to wykorzystać. W jaki sposób? Popatrzmy na poniższy algorytm:

1
2
3
4
5
6
7
8
9
10
11
12
13
U = obrazek wejściowy
T = obrazek z szumem
p = parametr algorytmu
Dla i = 1...n
 Dla j = 1..m
  Jeżeli U[i,j] > p
   T[i,j] = 255
  W przeciwnym razie:
   T[i,j] = 0 
  błąd = U[i,j] - T[i,j]
  U[i+1,j] += 1/3 błąd
  U[i,j+1] += 1/3 błąd  
  U[i+1,j+1] += 1/3 błąd    
Gdyby nie linijki 10-13, ten algorytm byłby dokładnie taki, jak pierwsza metoda polegająca na prostej kwantyzacji. W tych linijkach wykorzystujemy to, że to co widzimy, to średni kolor pikseli na obszarze. Jeżeli w jakimś miejscu, albo inaczej mówiąc - dla pewnego piksela, kwantyzacja da kiepski wynik (tzn. T[i,j] jest bardzo odległe od U[i,j]) to postaramy się nadrobić to na sąsiednich pikselach. Jeżeli $ T[i,j] $ jest ciemniejszy od $ U[i,j] $ ($ T[i,j] \geq U[i,j] $, czyli $ \mbox{błąd} \leq 0  $), to będziemy chcieli trochę rozjaśnić sąsiadów (i,j). Podobnie - jeżeli $ T[i,j] $ jest jaśniejszy od $ U[i,j] $ ($ T[i,j] \leq U[i,j] $, czyli $ \mbox{błąd} \geq 0  $), to będziemy chcieli trochę przyciemnić sąsiadów (i,j).

Ten efekt uzyskujemy rozdzielając (czyli propagując) błąd kwantyzacji (czyli $ \mbox{błąd} = U[i,j] - T[i,j] $) między sąsiadów (i,j). Wartość błędu wyliczamy w 10 linijce. Natomiast w linijkach 11-13 rozdzielamy błąd między sąsiadów (i,j).

5
Twoja ocena: Brak Ocena: 5 (9 ocen)

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com