12
Ví dụ biến đổi Fourier trong matlab: Cho ảnh f có giá trị tương ứng sau: f(0) = 2,f(1) = 4,f(2) = 6,f(3) = 0 tìm biến đổi Fourier rời rạc của dãy: matlab: đọc vào giá trị tương ứng của f: >> f = [2 4 6 0]; Thực hiện biến đổi Fourier: >> F = ifft(f1) Kết quả thu được như sau: F1 = 3.2500 -0.5000 - 0.2500i -0.2500 -0.5000 + 0.2500i Biến đổi Fourier rời rạc ngược: Cho F(0) = 2i, F(1) = 4i,F(2) = 6i,F(3) = 8i. Tính biến đổi Fourier rời rạc ngược. Matlab: >> F = [2i 4i 6i 8i] F = 0 + 2.0000i 0 + 4.0000i 0 + 6.0000i 0 + 8.0000i >> f = fft(F) Kết quả thu được như sau: f = 0 +20.0000i -4.0000 - 4.0000i 0 - 4.0000i 4.0000 - 4.0000i Ví dụ 5: Đọc vào một ảnh: >> f = imread('cameraman.tif'); Thực hiện phép biển đổi Fourier hai chiều: >> F = fft2(f); Phổ Fourier của ảnh là: >> SF = abs(F); Góc pha: >> pha = angle(F); Hiển thị phổ Fourier của ảnh: >> g = log(1+abs(fftshift(F))); >> imshow(g,[]) Hàm ifft2 (biến đổi Fourier rời rạc ngược hai chiều): >> fn = ifft2(F); >> imshow(fn)

94384893-Fourier-Trong-Matlab.pdf

Embed Size (px)

DESCRIPTION

Fourier-Trong-Matlab

Citation preview

Ví dụ biến đổi Fourier trong matlab:

Cho ảnh f có giá trị tương ứng sau:f(0) = 2,f(1) = 4,f(2) = 6,f(3) = 0tìm biến đổi Fourier rời rạc của dãy:

matlab:đọc vào giá trị tương ứng của f:>> f = [2 4 6 0];

Thực hiện biến đổi Fourier:>> F = ifft(f1)

Kết quả thu được như sau:F1 = 3.2500 -0.5000 - 0.2500i -0.2500 -0.5000 + 0.2500i

Biến đổi Fourier rời rạc ngược:

Cho F(0) = 2i, F(1) = 4i,F(2) = 6i,F(3) = 8i.Tính biến đổi Fourier rời rạc ngược.

Matlab:>> F = [2i 4i 6i 8i]F = 0 + 2.0000i 0 + 4.0000i 0 + 6.0000i 0 + 8.0000i

>> f = fft(F)

Kết quả thu được như sau:f = 0 +20.0000i -4.0000 - 4.0000i 0 - 4.0000i 4.0000 - 4.0000i

Ví dụ 5:Đọc vào một ảnh: >> f = imread('cameraman.tif');Thực hiện phép biển đổi Fourier hai chiều: >> F = fft2(f);Phổ Fourier của ảnh là: >> SF = abs(F);Góc pha: >> pha = angle(F);Hiển thị phổ Fourier của ảnh: >> g = log(1+abs(fftshift(F)));

>> imshow(g,[])Hàm ifft2 (biến đổi Fourier rời rạc ngược hai chiều): >> fn = ifft2(F);

>> imshow(fn)

hàm ifftshift đưa điểm vị trí trung tâm về góc bên trái trên cùng của phổ:>>ft= ifftshift(F);Giữ nguyên góc pha, thay đổi phổ của ảnh:>> G1 = 100 *exp(i*pha);>> f1 = ifft2(G1);Giữ nguyên phổ, thay đổi góc pha của ảnh:>> G2 = SF*exp(i*100);>> f2 = ifft2(G2);Kết quả thu được như sau:>> imshow(f1),figure,imshow(f2)

làm sắc nét ảnh với mặt nạ w như sau:

>> A = 1;>> w = [-1,-1,-1,-1,A+8,-1,-1,-1,-1];>> a =imread('rice.png');>> b = filter2(w,p);>> imshow(p), figure, imshow(a/255)

ảnh gốc ảnh làm sắc nét

Với A = 1.7, sắc nét của ảnh giảm dần:

Ngoài ra ta có thể sử dụng mặt nạ unsharp để làm sắc nét ảnh.Ví dụ:>> a = imread('tire.tif');>> u = fspecial('unsharp',0.5);>> au = filter2(u,a);>> imshow(a),figure,imshow(au/255)

ảnh gốc After unsharp masking

Ứng dụng khác của bộ lọc ngược:

Làm rõ ảnh mờ do chuyển động:

>> bc = imread('board.tif');>> bg = im2uint8(rgb2gray(bc));>> b = bg(100:355,50:305);>> m = fspecial('motion',7,0);

>> bm = imfilter(b,m);>> imshow(bm)

Để làm rõ ảnh ta cần thực hiện giữa phép chia DFT của ảnh mờ cho DFT của bộ lọc làm mờ ảnh.Trước tiên cần tạo ma trận tương đương với sự biến đổi làm mờ ảnh:

>> m2 = zeros(256,256);>>m2(1,1:7) = m;>>mf = fft2(m2);>>bmi = ifft2(fft2(bm)./mf);>> imshow(bm),figure, fftshow(bmi,'abs')Kết quả không được tốt do đặc tính của bộ lọc ngược:

Để khắc phục đặc tính của bộ lọc ngược, ta sử dụng một ngưỡng (để tránh chia cho 0):>> d = 0.02;>> mf = fft2(m2);>> mf(find(abs(mf)<1))=1;>> bmi = ifft2(fft2(bm)./mf);>> imshow(mat2gray(abs(bmi))*2)

Lọc thông thấp:Đầu tiên ta đọc vào một ảnh: >>cm = imread('cameraman.tif');Dịch chuyển phổ về trung tâm của ảnh và hiển thị nó:>>cf = fftshift(fft2(cm));>> fftshow(cf,'log')

Tiếp đến tạo một hình tròn (khoét lỗ):>>[x,y] = meshgrid(-128:127,-128:127);>>z = sqrt(x.^2+y.^2);Đốivới z >15 thì c nhận giá trị 0, ngược lại c nhận giá trị 1:>>c = (z<15);di qua thành phần tần số cao, giữ lại thành phần tần số thấp:>>cfl = cf.*c;>> fftshow(cfl,'log')

Biến đổi Fourier ngược để hiện thị ảnh ban đầu và hiển thị ảnh đó:>>cfli = ifft2(cfl);>>figure,fftshow(cfli,'log')

Nhiễu:

Để cộng nhiễu ”Salt and pepper” vào một ảnh ta dùng câu lệnh sau:>>t = imnoise(image,’salt & pepper’)Số lượng nhiễu cộng vào được mặc định là 10%. Ta có thể cung cấp thêm các thông số để thay đổi lượng nhiễu được cộng vào này.

Đọc vào một ảnh:>> a = imread('autumn.tif');

Thêm nhiễu muối và tiêu vào ảnh, với 10% nhiễu cộng vào:>> b= imnoise(a,'salt & pepper');

Xóa nhiễu muối tiêu với lọc trung bình:Thực hiện trong matlab bằng lệnh:>>w = fspecial(‘average’,[m,n])>>f = imfilter(g,w)

Áp dụng để loại bỏ nhiễu muối và tiêu:chuyển ảnh màu sang ảnh giá trị xám:>> a = rgb2gray(a);

Tạo mặt nạ lọc trung bình 3x3:>> a1 = fspecial('average');

Lọc ảnh với mặt nạ trung bình 3x3:>> b1 = filter2(a1,b);>> imshow(b1,[])

Tạo mặt nạ trung bình 7x7:>> a1 = fspecial('average',[7,7]);

Lọc ảnh với mặt nạ trung bình 7x7:>> b1 = filter2(a1,b);>> imshow(b1,[])

Sử dụng lọc trung vị xóa nhiễu muối tiêu:áp dụng để loại bỏ nhiễu muối và tiêu với mặt nạ lọc mặc định là 3x3:>> b2 = medfilt2(a);>> imshow(b2)

Với mặt nạ 5x5, nhiễu được loại bỏ nhiều hơn:>> b3 = medfilt2(a,[5 5]);

Nhiễu tuần hoàn:>> a = imread('cameraman.tif');Tạo ma trận tuần hoàn:>> [x y] = meshgrid(1:256,1:256);>> p = sin(x+y/1.5)+1;Cộng vào ảnh ma trận tuần hoàn:>> ap = (double(a)/128+p)/4;Dịch phổ về trung tâm của ảnh:>> cpf = fftshift(fft2(ap))Hiện thị ảnh:>> imshow(ap,[]),figure,imshow(log(abs(cpf)+1),[]),pixval on

nhiễu tuần hoàn phổ ảnh

Khử nhiễu tuần hoàn:1. Sử dụng lọc Band Reject:

Sử dụng một mặt nạ hình tròn br có bán kính bên trong hình là z.Có giá trị các pixels bên trong hình tròn là 1 và giá trị các pixels trên biên là 0.Đường biên phải có độ dày đủ lớn để che được các điểm nhiễu.

Tạo nhiễu tuần hoàn:>> [x,y] = meshgrid(1:256,1:256);>> s = 1+sin(x+y/1.5);

Đọc vào một ảnh:>> cm = imread('cameraman.tif');>> cp = (double(cm)/128+s)/4;

Dịch phổ về trung tâm của ảnh:>> cpf = fftshift(fft2(cp));

>> fftshow(cpf,'log'),pixval on

Chúng ta sẽ xóa những thành phần tăng đột biến và trả ngược lại kết quả. Đặt pixval on và di chuyển xung quanh ảnh, chúng ta tìm thấy những hàng, cột có giá trị tăng đột biến là (156,170) và (102,88). >> [x,y] = meshgrid(-128:127,-128:127);>> z = sqrt(x.^2+y.^2);

Khoảng cách từ đó từ đó tới trung tâm của ảnh là 49.0918:>> z(156,170)ans = 49.0918>> z(102,88)ans = 49.0918

Chúng ta tạo ra một lọc với br = 1 nếu (z<47 | z>51) và ngược lại bằng 0 (giữa vòng tròn nhỏ và vòng tròn lớn):>> br = (z<47 | z>51);

Thực hiện phép nhân bởi biến đổi:>> SF = fftshift(fft2(cp));>> tbr = SF.*br;>> figure,fftshow(tbr,'log')

Biến đổi Fourier ngược ta được:>> tbri =ifft2(tbr);>> figure,fftshow(tbri,'log')

A band-reject filter After inversion

2. Sử dụng bộ lọc Notch:

Sử dụng các đường kẻ ngang và đường kẻ dọc để che các điểm nhiễu sao cho giao của các đường kẻ này có thể che được các điểm nhiễu.

Tạo nhiễu tuần hoàn>> [x,y] = meshgrid(1:256,1:256);>> s = sin(x+y/1.5)+1;

Đọc vào ảnh “cameraman”:>> f = imread('cameraman.tif');Dịch phổ về trung tâm của ảnh:>> F = fftshift(fft2(a));

>> sf = (double(f)/128+s)/4;>> SF = fftshift(fft2(sf));>> fftshow(F,'log'),figure,fftshow(SF,'log')

F SF

Đơn giản là cho hàng và cột của thành phần phổ nhiễu bằng 0.Giả sử tọa độ của các thành phần nhiễu này lần lượt là (156,170), (102,88).

>> SF(156,:) = 0;>> SF(102,:) = 0;>> SF(:,88) = 0;>> SF(:,170) = 0;>> figure,fftshow(SF,'log')

Biến đổi Fourier ngược ta thu được ảnh ban đầu:>> ln =ifft2(SF);>> fftshow(ln,'log')

SF ln

Nhiều nhiễu trung tâm đã bị loại bỏ. Tạo nhiều hàng và cột dịch chuyển về vị trí nhiễu sẽ loại bỏ được nhiều nhiễu hơn.

Phát hiện đường biên, biên ngang, biên dọc:

Đọc vào một ảnh:>>ic = imread('circuit.tif');

Phát hiện đường biên đứng:>>px = [-1 0 1;-1 0 1;-1 0 1];

Tính đáp ứng mặt nạ px với ảnh ic:>>icx = filter2(px,ic);>>figure,imshow(icx/255)

Phát hiện đường biên ngang:py= px';% chuyen vi của px

Tính đáp ứng mặt nạ py với ảnh ic:icy = filter2(py,ic);figure,imshow(icy/255)

Kết hợp lọc đường biên ngang, biên dọc:Gọi px là kết quả của lọc đường biên song song với trục oy.Gọi py là kết quả của lọc đường biên song song với trục ox.

Gọi p là kết quả tổng hợp, có giá trị bằng: p yp x22 +

>>edge_p = sqrt(icx.^2+icy.^2);>>figure,imshow(edge_p/255)

C2: sử dụng hàm edge:Gõ lênh help edge

Phép dãn:Trong matlab gõ lệnh:>>imdilate(image,kernel )Với image là ảnh nhị phân hoặc ảnh mức xám cần giãn, kernel là ảnh nhân hay phần tử cấu trúc.

Ví dụ:>> t = imread('text.png');Tạo phần tử cấu trúc sq:>> sq = ones(3,3);Giãn ảnh t theo phần tử cấu trúc sq:>> td = imdilate(t,sq);

ảnh gốc ảnh sau khi giãn

phép co:Trong matlab thực hiện lệnh:>> imerode (image,kernel )Với image là ảnh nhị phân hoặc ảnh mức xám cần co, kernel là ảnh nhân hay phần tử cấu trúc.

Ví dụ:>> c = imread('text.png');Thực hiện phép co theo phần tử cấu trúc sq:

>> ce = imerode(c,sq);

ảnh gốc ảnh co

ứng dụng phép dãn và co là: phát hiện biên.Ví dụ:Tạo ảnh nhị phân dựa vào ngưỡng xám T:>> rice = imread('rice.png');>> r = rice > 110;Co ảnh theo phần tử cấu trúc sq:>> re = imerode(r,sq);Hiển thị đường biên của ảnh theo phép hiệu:>> r_int = r &~re;

ảnh gốc r biên ảnh r_int