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.