Należy samodzielnie odfiltrować obraz zniekształcony przez druk

Transkrypt

Należy samodzielnie odfiltrować obraz zniekształcony przez druk
Część 1
Ilustracja filtracji transformaty Fouriera dla obrazów i filtracji częstotliwości
przestrzennych.
Wczytujemy do pamięci obraz zawarty w zbiorze "czytnik.jpg"
obraz = imread('czytnik','jpg');
i wyświetlamy go.
image(obraz);
2
0 0
4
0 0
6
0 0
8
0 0
1 0 0 0
1 2 0 0
2
0 0
4 0 0
6 0
0
8
0 0 1 0 0 01
2 0 01 4 0 0 1 6
0 0
Wykonujemy transformatę Fouriera obrazu:
v = fft2(double(obraz)+1);
Zapamiętujemy wymiar tablicy po transformacie:
x=size(v,1);
y=size(v,2);
Liczba n będzie określać ilość elementów macierzy transformaty Fouriera które pozostaną
"nie wyzerowane".
n=100;
Zerujemy w transformacie obrazu wiersze i kolumny jak na rysunku
x
x-n
n
1
1
y-n y
n
Tylko elementy zaczernione pozostają niezerowe !!!!
v(n:x-n,:,:)=0;
v(:,n:y-n,:)=0;
Obliczamy odwrotną transformatę Fouriera:
vv = ifft2(v);
jej moduł,żeby pozbyć się liczb urojonych
vv = abs(vv);
Obraz musi być kodowany bajtami (unsigned integer długości 8 bitów):
obraz2 = uint8(round(vv-1));
Rysujemy obraz powstały po usunięciu z transformaty wielu wierszy i kolumn (rysunek dla
n=100).
image(obraz2);
2
0 0
4
0 0
6
0 0
8
0 0
1 0 0 0
1 2 0 0
2
0 0
4 0 0
6 0
0
8
0 0 1 0 0 01
2 0 01 4 0 0 1 6
0 0
Widać,że niewiele sie zmieniło. Zmniejszymy n do 70 (jeszcze więcej elementów "częstotliwości przestrzennych
zerujemy).
n=70;
v(n:x-n,:,:)=0;
v(:,n:y-n,:)=0;
vv = ifft2(v);
vv = abs(vv);
obraz2 = uint8(round(vv-1));
image(obraz2);
2
0 0
4
0 0
6
0 0
8
0 0
1 0 0 0
1 2 0 0
2
0 0
4 0 0
6 0
0
8
0 0 1 0 0 01
2 0 01 4 0 0 1 6
0 0
Tak wygląda obraz przy n=70. Widać prążki na krawędziach (skąd się one biorą?? – odpowiedź dać w
sprawozdaniu).
n=50;
v(n:x-n,:,:)=0;
v(:,n:y-n,:)=0;
vv = ifft2(v);
vv = abs(vv);
obraz2 = uint8(round(vv-1));
image(obraz2);
2
0 0
4
0 0
6
0 0
8
0 0
1 0 0 0
1 2 0 0
2
0 0
Taki jest wynik dla n=50.
n=20;
v(n:x-n,:,:)=0;
v(:,n:y-n,:)=0;
vv = ifft2(v);
vv = abs(vv);
obraz2 = uint8(round(vv-1));
image(obraz2);
4 0 0
6 0
0
8
0 0 1 0 0 01
2 0 01 4 0 0 1 6
0 0
2
0 0
4
0 0
6
0 0
8
0 0
1 0 0 0
1 2 0 0
2
0 0
4 0 0
6 0
0
8
0 0 1 0 0 01
2 0 01 4 0 0 1 6
4 0 0
6 0
0
8
0 0 1 0 0 01
2 0 01 4
0 0
a taki dla n=20.
n=10;
v(n:x-n,:,:)=0;
v(:,n:y-n,:)=0;
vv = ifft2(v);
vv = abs(vv);
obraz2 = uint8(round(vv-1));
image(obraz2);
2 0 0
4 0 0
6 0 0
8 0 0
1
0 0 0
1
2 0 0
2 0 0
0 01 6 0 0
To jest obraz dla n=10 (z 1200x1600=1920000 elementów macierzy częstotliwości zostało 4x10x10=400
elementów niezerowych i jeszcze coś widać!!!)
Zrealizować samodzielnie odfiltrowanie małych częstotliwości przestrzennych z takim rezultatem:
2 0 0
4 0 0
6 0 0
8 0 0
1 0 0 0
1 2 0 0
2 0 0
4 0 0
6 0 0
8 0 0
1 0 0 0 1 2 0 0 1 4 0 0 1 6 0 0
Część 2
Filtrację przestrzenną można m.in. stosować do polepszenia obrazów uzyskiwanych w
komorze pęcherzykowej. Poniższy przykład pokazuje, jak z obrazu można wyrzucić
wszystkie linie poziome, które nie są interesujące i „zaciemniają obraz” obserwowanych
torów cząstek po zderzeniach.
W ćwiczeniu należy samodzielnie napisać skrypt do realizacji takiego filtru. Obraz
pierwotny znajduje się w zbiorze „pęcherzyki.tif”.
2 0
2 0
4 0
4 0
6 0
6 0
8 0
8 0
1 0 0
1 0 0
1 2 0
1 2 0
5 0
1 0 0
1 5 0
2 0
2 0
4 0
4 0
6 0
6 0
8 0
8 0
1 0 0
1 0 0
1 2 0
1 2 0
5 0
1 0 0
1 5 0
5 0
1 0 0
1 5 0
5 0
1 0 0
1 5 0
Część 3
Należy samodzielnie odfiltrować obraz zniekształcony przez druk rastrowy („gazetowy”) tak,
jak w podanym przykładzie:
5 0
5 0
1 0 0
1 0 0
1 5 0
1 5 0
2 0 0
2 0 0
2 5 0
2 5 0
3 0 0
3 0 0
3 5 0
3 5 0
4 0 0
4 0 0
4 5 0
4 5 0
1 0 0
2 0 0
3 0 0
5 0
5 0
1 0 0
1 0 0
1 5 0
1 5 0
2 0 0
2 0 0
2 5 0
2 5 0
3 0 0
3 0 0
3 5 0
3 5 0
4 0 0
4 0 0
4 5 0
4 5 0
1 0 0
2 0 0
3 0 0
1 0 0
2 0 0
3 0 0
1 0 0
2 0 0
3 0 0
Gdzie:
W wierszu pierwszym - obraz zniekształcony i jego transformata Fouriera, a w wierszu
drugim lekko oczyszczony i jego transformata Fouriera (pokazany efekt nie jest jeszcze
najlepszy). Każda z grup ćwiczeniowych używa innego obrazu pierwotnego.
W sprawozdaniu podać własny algorytm filtrowania.