matlab逆滤波、维纳滤波、最小二乘滤波
生活随笔
收集整理的這篇文章主要介紹了
matlab逆滤波、维纳滤波、最小二乘滤波
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
主要就是寫公式和調用函數,注釋應該還挺清晰的,直接復制就能運行
模擬大氣湍流
im = imread("demo1.jpg"); subplot(131); imshow(im); title('原圖'); k = 0.0025; [h, w] = size(im); % 傅里葉變換 F = fftshift(fft2(im)); % 計算退化模型 H = zeros(h, w); for i = 1 : hfor j = 1 : wH(i, j) = exp(-k * ((i - h/2)^2 + (j - w/2)^2)^(5/6));end end % 計算退化后的圖像 SDF = F.*H; im_sat = uint8(real(ifft2(SDF))); subplot(132); imshow(im_sat); title('模擬大氣湍流');% 直接逆濾波 F_N = SDF./H; im_N = uint8(real(ifft2(F_N))); subplot(133); imshow(im_N); title('直接逆濾波');模擬運動模糊
im = imread("demo2.jpg"); subplot(231); imshow(im); title('原圖');% 傅里葉變換 im = im2double(im); F=fftshift(fft2(im));% 計算退化模型 [M,~] = size(im); T = 1; a = 0.1; b = 0.1; v = (-M / 2:M / 2-1); u = v'; A = repmat(a.*u, 1, M) + repmat(b.*v, M, 1); H = T/pi./A.*sin(pi.*A).*exp(-1i*pi.*A); H(A == 0) = T;% 計算退化后的圖像 SDF = F.*H; im_smb = real(ifft2(ifftshift(SDF))); subplot(232); imshow(im_smb); title('運動模糊');% 加噪 % noise = imnoise(im_smb,"gaussian", 0, 0.01); % 直接在空域對圖像加噪 noise = imnoise(zeros(M,M),"gaussian",0, 0.00001); %獲取空域噪聲 FNoise = fftshift(fft2(noise)); % 將噪聲轉化到頻域 SDFN = F.*H + FNoise; % 圖像加噪 im_smbn = real(ifft2(ifftshift(SDFN))); subplot(233); imshow(im_smbn); title('運動模糊加高斯噪聲');% 無噪直接逆濾波 F_N = SDF./H; im_N = real(ifft2(ifftshift(F_N))); subplot(234); imshow(im_N); title('無噪直接逆濾波');% 有噪直接逆濾波 F_NN = SDFN./H; im_NN = real(ifft2(ifftshift(F_NN))); subplot(235); imshow(im_NN); title('有噪直接逆濾波');% 截止半徑R內逆濾波 R = 5; FD = zeros(M); for i = 1:Mfor j = 1:Mif sqrt((i - M/2).^2 + (j - M/2).^2) < RFD(i,j) = SDFN(i,j)./H(i,j);endend end im_NNR = real(ifft2(ifftshift(FD))); subplot(236); imshow(im_NNR); title('有噪截止半徑5逆濾波');%%% 維納濾波 %%%figure(); subplot(221); imshow(im); title('原圖'); subplot(222); imshow(im_smbn); title('運動模糊加高斯噪聲'); % 維納濾波公式 buf=(abs(H)).^2; % H(u,v)^2 SNR=(FNoise.^2)./(F.^2); % 計算理論K值,功率譜除后平方 F_WN=SDFN./H.*buf./(buf+SNR); % 代入公式 im_wf=real(ifft2(ifftshift(F_WN))); % 逆傅里葉變換 subplot(223); imshow(im_wf); title('理論維納濾波');% k = 0.01的維納濾波 bestK=0.02; F_WN=SDFN./H.*buf./(buf+bestK); im_wf=real(ifft2(ifftshift(F_WN))); subplot(224); imshow(im_wf); title('k=0.02維納濾波');最小二乘濾波
I = im2double(imread('demo2.jpg')); [hei,wid,~] = size(I); subplot(2,2,1),imshow(I); title('原圖像'); % 模擬運動模糊. LEN = 21; THETA = 11; PSF = fspecial('motion', LEN, THETA);%產生運動模糊算子,即點擴展函數 blurred = imfilter(I, PSF, 'conv', 'circular'); subplot(2,2,2), imshow(blurred); title('模糊圖像'); Pf = psf2otf(PSF,[hei,wid]);%退化函數的FFT % 添加加性噪聲 noise_mean = 0; noise_var = 0.00001; blurred_noisy = imnoise(blurred, 'gaussian',noise_mean, noise_var); subplot(2,2,3), imshow(blurred_noisy) title('帶運動模糊和噪聲圖像') p = [0 -1 0;-1 4 -1;0 -1 0];%拉普拉斯模板 P = psf2otf(p,[hei,wid]); gama = 0.001; If = fft2(blurred_noisy); numerator = conj(Pf);%conj函數,用于求一個復數的復共軛 denominator = Pf.^2 + gama*(P.^2); deblurred2 = ifft2( numerator.*If./ denominator );%約束最小二乘方濾波在頻率域中的表達式 subplot(2,2,4), imshow(deblurred2) title('約束最小二乘方濾波后圖像');自動調參最小二乘濾波
im = imread('demo2.jpg'); [M,~] = size(im); im = im2double(im); subplot(2,2,1), imshow(im) title('原圖')% 加模糊 PSF = fspecial('motion', 100, 11); im_smb = imfilter(im, PSF, 'conv', 'circular');% 加噪 mean = 0; var = 0.00001; im_smbn = imnoise(im_smb, 'gaussian', mean, var); subplot(2,2,2), imshow(im_smbn) title('運動模糊加高斯噪聲')% 運動模糊的傅里葉變換 H = psf2otf(PSF,[M,M]);% 函數的傅里葉變換 p = [0 -1 0; -1 4 -1; 0 -1 0]; % 拉普拉斯算子 P = psf2otf(p,[M,M]);% gama = M*M*(mean+var*var); gama = 0.001; % 參數γG = fft2(im_smbn); H2 = conj(H); % H的復共軛 im_LS = ifft2( H2.*G./ (H.^2 + gama*(P.^2)));% 最小二乘方濾波公式 subplot(2,2,3), imshow(im_LS) title('手動調參最小二乘方濾波');gap=0.0001; gama=0.0001; a=0.05; yita=M*M*(mean+var*var); iteration=0; while (true)iteration = iteration+1;if iteration > 10000 % 設置循環次數break;endFs=(H2.*G)./ (abs(H).^2+gama*(abs(P).^2));R=G-H.*Fs;r=ifftshift(R);r_=ifft2(r);rr=sum(sum(r_.^2));if rr<yita + agama = gama + gap;elseif rr > yita + agama = gama - gap;elsebreakend endim_LS = ifft2( H2.*G./ (H.^2 + gama*(P.^2))); subplot(2,2,4), imshow(im_LS) title('自動調參最小二乘方濾波');實現效果
總結
以上是生活随笔為你收集整理的matlab逆滤波、维纳滤波、最小二乘滤波的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用c语言的多学科协同仿真软件,Mult
- 下一篇: LM358