Częstości w obrazie i dwuwymiarowa transformata Fouriera
Transkrypt
Częstości w obrazie i dwuwymiarowa transformata Fouriera
Laboratorium_EEG/ Wstęp do analizy obrazu Spis treści 1 Częstości w obrazie i dwuwymiarowa transformata Fouriera 2 Korelacja i splot dla obrazu 3 Dwuwymiarowe filtry FIR 3.1 Metoda transformacji częstości 3.2 Kilka konkretnych filtrów 4 Filtry nieliniowe 5 Ćwiczenia Częstości w obrazie i dwuwymiarowa transformata Fouriera O analizie obrazów za pomocą Pythona można poczytać tu. Obrazy możemy analizować tak jakby były to sygnały 2D. Aby uświadomić sobie związki między jednowymiarowym sygnałem a obrazem — sygnałem 2D — zrobimy następujące ćwiczenie: Generujemy w jednym wymiarze funkcję sinus o 10 okresach na 100 punktów: X=100; %pikseli Fs=1/X; %czestosc probkowania co jeden piksel dx=1; x=:dx:X-dx; fx=10/X; % czestosc sinusa 10 okresów na X syg=sin(2*pi*x*fx+pi/3); figure(1) plot(x,syg) Ten obrazek jest znajomy. Teraz przekształcimy go w obraz: figure(2) % teraz zrobimy z niego obraz 2D Y=X/2; SYG=zeros(Y,X); for i=1:Y SYG(i,:)=syg; end subplot(2,2,1) imagesc(SYG) set(gca,'Ydir','normal'); colormap(gray) Te zmieniające intensywność prążki to właśnie obrazek przedstawiający funkcję sinus w kierunku X. Zobaczmy jak wygląda jego transformata Fouriera: subplot(2,2,2) S=fft2(SYG); SK_X=-X/2:X/2; SK_Y=-X/2:X/2; imagesc(SK_X,SK_Y,abs(fftshift(S))) set(gca,'Ydir','normal'); colormap(gray) Oraz ten sam sygnał z dodaną składową stałą i jego transformata: subplot(2,2,3) imagesc(SYG+1) set(gca,'Ydir','normal'); colormap(gray) subplot(2,2,4) S=fft2(SYG+1); imagesc(SK_X,SK_Y,abs(fftshift(S))) set(gca,'Ydir','normal'); colormap(gray) pause Korelacja i splot dla obrazu Przyjmijmy konwencję: obraz = duża macierz jądro splotu/korelacji = mniejsza macierz załóżmy, że mamy obraz A: A = [17 24 1 8 15 23 4 10 11 5 6 12 18 7 13 19 25 14 20 21 2 16 22 3 9]; i jądro korelacji h = [8 3 4 1 5 9 6 7 2]; wówczas operacja korelacji dla elementu A(2,4) jest następująca: 1. kładziemy macierz h elementem środkowym (5) na elemencie A(2,4) (czyli 14) 2. wymnażamy przez siebie wszystkie pokrywające się elementy i sumujemy iloczyny A(2,4)=1*8 + 8*1 +15*6 + 7*3 + 14*5 + 16*7+ 13*4 + 20*9 +22*2 W matlabie mamy funkcję filter2(h,A), która wykonuje powyższą operację- dwuwymiarową korelację. Bardzo podobna jest operacja dwuwymiarowego splotu. Jedyna różnica jest taka, że przed operacją mnożenia i dodawania jądro jest obracane o 180 stopni. >> rot90(rot90(h)) ans = 2 7 6 9 5 1 4 3 8 Operacja splotu jest zaimplementowana jako conv2 Zarówno operacja splotu jak i korelacji jest kiepsko określona na brzegach obrazu, tam gdzie jądro wystaje poza brzeg. W obu przypadkach wykonywane jest domyślnie dopełnianie obrazu zerami. Efekt ten widać w poniższym przykładzie jako czarne krawędzie. I = single(imread('coins.png')); h = ones(5,5) / 25; I2 = filter2(h,I); I3 = conv2(h,I); subplot(2,2,1) imagesc(I), title('Pierwotny obraz'); subplot(2,2,2) imagesc(I2), title('Filtrowany obraz') subplot(2,2,3) imagesc(I3), title('Splatany obraz') colormap('gray') Dwuwymiarowe filtry FIR Są naturalnym rozszerzeniem jednowymiarowych filtrów FIR i dają się łatwo zapisać w postaci macierzowej. Metoda transformacji częstości Projektujemy filtr jednowymiarowy i transformujemy go na 2D: b = remez(10,[ 0.4 0.6 1],[1 1 h = ftrans2(b); [H,w] = freqz(b,1,64,'whole'); colormap(jet(64)) plot(w/pi-1,fftshift(abs(H))) figure, freqz2(h,[32 32]) ]); Zprojektujmy i zastosujmy filtr górnoprzepustowy do obrazka: b = fir1(14,0.25,'high'); h = ftrans2(b); [H,w] = freqz(b,1,64,'whole'); colormap(jet(64)) subplot(2,2,1) plot(w/pi-1,fftshift(abs(H))) subplot(2,2,2), freqz2(h,[32 32]) load spine subplot(2,2,3) imagesc(X) colormap bone subplot(2,2,4) imagesc(filter2(h,X)) Kilka konkretnych filtrów A teraz kilka powszechnie stosowanych filtrów. Proszę zbadać funkcję odpowiedzi impulsowej i działanie filtra na nasz przykładowy obrazek. Filtr uśredniający 1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9 Filtr wyostrzający 0 -1 -1 5 -1 -1 Filtr uwypuklający -1 -1 -1 -1 -1 -1 -1 1 -1 -1 -1 1 1 1 1 1 1 1 1 1 Filtry nieliniowe Dotychczas rozważane filtry obliczały lokalną korelację jądra filtru z kolejnymi fragmentami obrazu, czyli wykonywały tam operację liniową. Łatwo sobie wyobrazić, że w kolejnych „okienkach” filtra będziemy wykonywać dowolną inną operację np. medianę i jej wartość wpisywać jako element wynikowego obrazka. Wczytajmy przykładowy obrazek: I = imread('eight.tif'); subplot(2,2,1), imshow(I) title('oryginalny obraz') dodajemy szum: J = imnoise(I,'salt & pepper',0.02); subplot(2,2,2), imshow(J) Filtrujemy obrazek filtrem uśredniającym K = filter2(fspecial('average',3),J)/255; subplot(2,2,3), imshow(K) A teraz medianowym L = medfilt2(J,[3 3]); subplot(2,2,4), imshow(L) Ćwiczenia Proszę pobrać i wczytać do Matlaba zdjęcie. Analogicznie jak w przykładzie z kręgosłupem, proszę zaprojektować filtr dolnoprzepustowy, oraz filtr górnoprzepustowy i obejrzeć uzyskiwane obrazy i ich widma. Filtr pasmowo-przepustowy można zaprojektować za pomocą funkcji remez. Proszę pobrać i wczytać do Matlaba obraz. Analogicznie jak w przykładzie z kręgosłupem, proszę zaprojektować filtr dolnoprzepustowy, który usunie z obrazu pięć struktur o wysokich częstościach przestrzennych.