画像フーリエ変換実験

1. 実験の目的

1. フーリエ変換と逆変換の基本原理と手法を習得する。
2. 周波数領域フィルタリングの基本原理と方法を理解します。
3. 画像周波数領域フィルタリングの方法をマスターします。

2. 実験原理

1. スムージングフィルター

(1) 線形平滑化フィルタ

線形ローパス平滑化フィルターのすべての係数は正の数です。テンプレートの場合3×3、最も単純な平均フィルターはすべての係数を 1 とします。出力画像を元の画像のグレー値の範囲内に保つために、テンプレートは隣接しています。ピクセルにすべてのドメイン積を 9 で割ります。MATLABフィルターを生成する関数で使用されるテンプレートを提供しfspecialfilter2指定されたフィルター テンプレートを使用して画像を操作する関数を提供します。画像にノイズを加える機能MATLAB用意されていますので、コマンド使い方はご自身で参考にしてください。同様の機能もありますので、ご自身で調べて使いこなしてください。imnoiseMATLABhelpfspecialfilter2imnoiseOpenCV

(2) 非線形平滑化フィルタ

メディアン フィルターは、一般的に使用される非線形平滑化フィルターです。そのフィルター原理は平均フィルター法と似ていますが、加重合計を計算する代わりに、グレー レベルに従って近傍の画像のピクセルを並べ替えます。このグループの値が出力ピクセル値として選択されます。MATLABメディアン フィルタリングを実装するための関数が提供されていますmedfilt2OpenCV同様の機能もありますので、学生自身で問い合わせてください。

2.シャープネスフィルター

画像のスムージング処理により画像の境界線や輪郭がぼやけてしまうことが多く、その影響を軽減するには画像鮮鋭化技術を用いて画像のエッジを鮮明にする必要があります。

(1) 線形鮮鋭化フィルタ

線形ハイパス フィルターは、最も一般的に使用される線形鮮明化フィルターです。このフィルターの中心の係数はすべて正ですが、周囲の係数はすべて負であり、すべての係数の合計は 0 です。

(2) 非線形鮮鋭化フィルタ

平均化は積分に対応するため、近傍平均を使用すると画像がぼやける可能性があり、微分を使用すると画像が鮮明になります。画像処理で最も一般的に使用される微分方法は、勾配を利用します。一般的に使用される空間領域非線形鮮鋭化フィルター微分演算子には、sobel演算子、prewitt演算子、log演算子などが含まれます。

3. 周波数領域の強化

周波数領域強調は、画像変換方法を使用して元の画像空間の画像を何らかの形式で他の空間に変換し、この空間の固有のプロパティを使用して画像を便利に処理し、最後に元の画像空間に変換します。 、処理された画像を取得します。
周波数領域強調の主な手順は次のとおりです。
(1) 入力画像を周波数領域空間に変換するための変換方法を選択します。
(2) 周波数領域空間上で、処理目的に応じた伝達関数を設計し、処理します。
(3)得られた結果を逆変換して、強調された画像を得る。
(4) 一般的に使用される周波数領域の強調方法には、ローパス フィルタリングとハイパス フィルタリングが含まれます。

4. ローパスフィルタリング

画像のエネルギーの大部分は振幅スペクトルの低周波および中周波部分に集中しており、画像のエッジとノイズは高周波部分に対応します。したがって、高周波成分の振幅を低減するフィルタを使用すると、ノイズの影響を低減できます。畳み込み定理によれば、ローパス フィルター処理の数学的表現は周波数領域で実現されます。

(1) 理想ローパスフィルター ( ILPF)

ここに画像の説明を挿入

(2) バターワースローパスフィルター ( BLPF)

ここに画像の説明を挿入

(3) 指数関数的ローパスフィルター ( ELPF)

ここに画像の説明を挿入

5. ハイパスフィルタリング

画像の詳細は高周波成分に対応しているため、ハイパス フィルター処理により画像を鮮明にすることができます。ハイパスフィルターはローパスフィルターの逆で、高周波成分を滑らかに通過させ、低周波成分を弱めます。ハイパス フィルターはローパス フィルターに似ており、その伝達関数は次のとおりです。

(1) 理想的なハイパスフィルター ( IHPF)

ここに画像の説明を挿入

(2) バターワースハイパスフィルター ( BLPF)

ここに画像の説明を挿入

(3) 指数関数的ハイパスフィルター ( ELPF)

ここに画像の説明を挿入
画像がハイパス フィルターで処理されると、多くの低周波情報が失われるため、画像の滑らかな領域は基本的に消えます。したがって、高周波強化フィルタリングを使用してそれを補うことができます。高周波拡張フィルタリングでは、フィルタ伝達関数を設計するときに、0 より大きく 1 未満の定数を追加します。つまり、次のようになります。
ここに画像の説明を挿入

3. 実験コンテンツのステップ (実験の主なステップを記録し、デバッグが成功した後、スクリーンショットを撮るか写真を撮って結果を保存します)

以下の実験を完了するにはMATLAB、 またはを使用する必要があります。OpenCV

1. スムーズな空間フィルタリング

(1) グレースケール画像を読み出し、この画像に塩胡椒ノイズとガウス ノイズを追加し、前の画像と同じ画像ウィンドウに表示します。
lena = imread('lena.jpg'); %读入原始图像
lena_gray = rgb2gray(lena); %原始图像灰度化

figure, subplot(1, 3, 1);
imshow(lena_gray);
title('原始图像');
lena_pepper = imnoise(lena_gray, 'salt & pepper', 0.02); %加入椒盐噪声

subplot(1, 3, 2);
imshow(lena_pepper);
title('椒盐噪声图像');

lena_gauss = imnoise(lena_gray, "gaussian", 0.02); %加入高斯噪声
subplot(1, 3, 3);
imshow(lena_gauss);
title('高斯噪声图像');

ここに画像の説明を挿入

(2) ノイズを付加した画像に対して異なるスムージング (ローパス) テンプレートを選択し、異なるテンプレートの効果を比較し、同じウィンドウに表示します。
lena = imread('lena.jpg'); %读入原始图像

lena_gray = rgb2gray(lena); %原始图像灰度化
figure, subplot(1, 3, 1);
imshow(lena_gray);
title('原始图像');

lena_pepper = imnoise(lena_gray, 'salt & pepper', 0.02); %加入椒盐噪声
subplot(1, 3, 2);
imshow(lena_pepper);
title('椒盐噪声图像');

lena_gauss = imnoise(lena_gray, "gaussian", 0.02); %加入高斯噪声
subplot(1, 3, 3);
imshow(lena_gauss);
title('高斯噪声图像');

%对椒盐噪声图像进行滤波处理
h = fspecial('average', 3);
I1 = filter2(h, lena_pepper) / 255; %二维数字滤波器
I2 = medfilt2(lena_pepper, [3 3]); %二维中位数滤波
figure, subplot(2, 2, 1);
imshow(lena);
title('原始图像');

subplot(2, 2, 2);
imshow(lena_pepper);
title('椒盐噪声图像');

subplot(2, 2, 3);
imshow(I1);
title('3*3 均值滤波图像');

subplot(2, 2, 4);
imshow(I2);
title('3*3 中值滤波图像');

%对高斯噪声图像进行滤波处理
G1 = filter2(h, lena_gauss) / 255; %二维数字滤波器
G2 = medfilt2(lena_gauss, [3 3]); %二维中位数滤波

figure, subplot(2, 2, 1);
imshow(lena);
title('原始图像');

subplot(2, 2, 2);
imshow(lena_gauss);
title('高斯噪声图像');

subplot(2, 2, 3);
imshow(G1);
title('3*3 均值滤波图像');

subplot(2, 2, 4);
imshow(G2);
title('3*3 中值滤波图像');

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

(3)MATLAB関数を使用する場合、さまざまなパディング方法 (またはゼロ パディング、' '、' '、' 'imfilterなどの境界オプション) を使用してローパス フィルターを実行し、処理されたイメージを表示します。replicatesymmetriccircular
close all
lena=imread('lena.jpg');    %将原始图像读入
lena_gray=rgb2gray(lena);   %将图像灰度化
h=fspecial('motion',50,45);  %创建预定义的二维滤波器
filteredimg=imfilter(lena_gray,h);    % 对图像进行滤波,默认通过使用相关来完成
boundaryReplicate=imfilter(lena_gray,h,"replicate") ;    %图像大小通过复制外边界的值来扩展
boundary0=imfilter(lena_gray,h,0);   % 输入图像的边界通过用值X(无引号)来填充扩展,其默认值为0
boundarysymmetric=imfilter(lena_gray,h,"symmetric");  %图像大小通过镜像反射其边界来扩展
boundarycircular=imfilter(lena_gray,h,'circular');   %图像大小通过将图像看成是一个二维周期函数的一个周期来扩展

figure,subplot(3,2,1);%为各个分块创建分区
imshow(lena);   
title('原始图像');
subplot(3,2,2);
imshow(filteredimg);
title('Motion Blurred');
subplot(3,2,3);
imshow(boundaryReplicate);
title('Replicate');
subplot(3,2,4);
imshow(boundary0);
title('0-Padding');
subplot(3,2,5);
imshow(boundarysymmetric);
title('symmetric');
subplot(3,2,6);
imshow(boundarycircular);
title('cicular');

ここに画像の説明を挿入

(4) ループを使用して、塩胡椒ノイズのある画像に対して 10 および 20 の平均フィルタリングを実行し、その特性を確認し、平均処理後の画像を表示します (注意: 平均フィルタforを生成するには、関数の ' ' タイプを使用します) 。 。fspecialaverage
close all
lena=imread('lena.jpg');    %将原始图像读入
lena_gray=rgb2gray(lena);   %将图像灰度化
lena_pepper=imnoise(lena_gray,'salt & pepper',0.02);    %加入椒盐噪声
h=fspecial('average');      %生成均值滤波器
for i=1:10  %对椒盐噪声图像进行10次均值滤波
    J1=imfilter(lena_pepper,h); end
for j=1:20  %对椒盐噪声图像进行20次均值滤波
    J2=imfilter(lena_pepper,h); end;
figure,subplot(1,3,1);
imshow(lena_pepper);
title('椒盐噪声图像');
subplot(1,3,2);
imshow(J1);
title('10次均值滤波');
subplot(1,3,3);
imshow(J2);
title('20次均值滤波');

ここに画像の説明を挿入

(5) ごま塩ノイズのある画像については、ノイズの多い画像を平均フィルタ法とメディアンフィルタ法でそれぞれ処理し、その結果を同一ウィンドウに表示する必要があります。
close all
lena=imread('lena.jpg');    %读入原始图像
lena_gray=rgb2gray(lena);   %将图像灰度化
lena_pepper=imnoise(lena_gray,'salt & pepper',0.02);    %加入椒盐噪声
h=fspecial('average');  %生成均值滤波器
J1=imfilter(lena_pepper,h);
J2=medfilt2(lena_pepper);
figure,subplot(1,3,1);
imshow(lena_pepper);
title('椒盐噪声图像');
subplot(1,3,2);
imshow(J1);
title('均值滤波法');
subplot(1,3,3);
imshow(J2);
title('中值滤波法');

ここに画像の説明を挿入

(6) 平滑化空間フィルタを自分で設計し、ノイズ画像上で処理し、処理後の画像を表示します。
lena=imread('lena.jpg');    %读入原始图像
lena_gray=rgb2gray(lena);   %将图像灰度化
lena_pepper=imnoise(lena_gray,'salt & pepper',0.02);    %加入椒盐噪声
[m,n]=size(lena_pepper);
figure,subplot(1,2,1);
imshow(lena_pepper);
title('椒盐噪声图');
s=zeros(1,9);
for i=2:1:m-1
    for j=2:1:n-1
        h=1;
        for p=i-1:1:i+1
            for q=j-1:1:j+1
                s(h)=lena_pepper(p,q);
                h=h+1;
            end
        end
        s=sort(s);
       I(i,j)=s(3,3);
    end
end

subplot(1,2,2);
imshow(I);
title('噪声处理后的图像');

ここに画像の説明を挿入

2.空間フィルタリングを鮮明にする

(1) グレースケール画像を読み出し、ラプラシアン演算子を使用してフィルタリングします。
close all
lena=imread('lena.jpg');    %读入原始图像
lena_gray=rgb2gray(lena);   %将图像灰度化
lena_double=im2double(lena_gray) %将图像转换为双精度值
w=[1,1,1;
    1,-8,1;
    1,1,1]
k=conv2(lena_double,w,"same");
figure,subplot(1,2,1);      
imshow(lena);
title('原始图像');
subplot(1,2,2);      
imshow(k);
title('滤波处理后的图像');

ここに画像の説明を挿入

w = genlaplacian(n)(2)任意の奇数サイズのラプラシアンを自動的に生成する関数を作成します。

ここに画像の説明を挿入

num=input('请输入数字n:');
n=num;
W=ones(n,n);
for i =1:n
    for j=1:n
        if(i==fix(n/2)+1&&j==fix(n/2)+1)
            W(i,j)=n*n-1;
        end
    end
end
display(W)

ここに画像の説明を挿入

(3) 5×5、9×9、15×15、および 25×25 のラプラシアン演算子を使用して画像をシャープ化およびフィルタリングし、式が異なるため、同じウィンドウ内に表示する必要があります。
function [w]=lapulasi(num)
n=num;
w=ones(n);
x=fix(n/2)+1;
w(x,x)=-(n*n-1);
end
function [w]=lapulasi(num)
n=num;
w=ones(n);
x=fix(n/2)+1;
w(x,x)=-(n*n-1);
end
lena=imread("lena.jpg");    %读入原始图像
lena_double=im2double(lena);    %将图像转换为双精度值
figure,subplot(2,3,1);
imshow(lena_double);
title('原始图像');
w0=lapulasi(3);
w1=lapulasi(5);
w2=lapulasi(9);
w3=lapulasi(15);
w4=lapulasi(25);
lena_0=lena_double-imfilter(lena_double,w0,"replicate");
subplot(2,3,2);
imshow(lena_0);
title('3*3 拉普拉斯');
lena_1=lena_double-imfilter(lena_double,w1,"replicate");
subplot(2,3,3);
imshow(lena_1);
title('5*5 拉普拉斯');
lena_2=lena_double-imfilter(lena_double,w2,"replicate");
subplot(2,3,2);
imshow(lena_2);
title('9*9 拉普拉斯');
lena_3=lena_double-imfilter(lena_double,w3,"replicate");
subplot(2,3,5);
imshow(lena_3);
title('15*15 拉普拉斯');
lena_4=lena_double-imfilter(lena_double,w4,"replicate");
subplot(2,3,6);
imshow(lena_4);
title('25*25 拉普拉斯');
(4) さまざまなグラデーション演算子を使用して画像をシャープ化し、フィルタリングし、その効果を比較します。
[I,map]=imread('lena_gray.jpg'); 
I=double(I); 
subplot(2,3,1) 
imshow(I,map); 
title('原始图像'); 
[Gx,Gy]=gradient(I); % 梯度计算 
G=sqrt(Gx.*Gx+Gy.*Gy); % 矩阵 
J1=G; % 梯度1 
subplot(2,3,2)
imshow(J1,map); 
title(' 操作1图像'); 
J2=I; % 梯度2 
K=find(G>=7); 
J2(K)=G(K); 
subplot(2,3,3) 
imshow(J2,map); 
title('操作2图像'); 
J3=I; % 梯度3 
K=find(G>=7); 
J3(K)=255; 
subplot(2,3,4) 
imshow(J3,map); 
title('操作3图像'); 
J4=I; % 梯度4 
K=find(G<=7); 
J4(K)=255; 
subplot(2,3,5) 
imshow(J4,map); 
title('操作4图像'); 
J5=I; %梯度5 
K=find(G<=7); 
J5(K)=0; 
Q=find(G>=7); 
J5(Q)=255; 
subplot(2,3,6) 
imshow(J5,map); 
title('操作5图像');

ここに画像の説明を挿入

(5) 鮮鋭化空間フィルタを自分で設計し、ノイズ画像上で処理し、処理後の画像を表示します。
lena=imread("lena.jpg");
lena_gray=rgb2gray(lena);   %转换为灰度图像
h=fspecial("sobel");
h1=h'*0.5;
h2=h';
h3=h'*1.5;
z1=imfilter(lena_gray,h1);
z2=imfilter(lena_gray,h2);
z3=imfilter(lena_gray,h3);
figure,subplot(2,2,1);
imshow(lena_gray);
title('原始图像');
subplot(2,2,2);
imshow(z1);
title('梯度算子1');
subplot(2,2,3);
imshow(z2);
title('梯度算子2');
subplot(2,2,4);
imshow(z3);
title('梯度算子3');

ここに画像の説明を挿入

3. フーリエ変換

(1) グレースケール画像を読み出し、高速フーリエ変換を行い、その振幅画像と位相画像をそれぞれ表示します。
lena=imread("lena.jpg");
lena_gray=rgb2gray(lena);
f1=fft2(lena_gray); %快速傅里叶变换
f2=log(1+abs(f1));  %振幅谱
f3=fftshift(f1);
f4=angle(f1);   %相位谱
figure,subplot(1,3,1);
imshow(lena_gray);
title('原始图像');
subplot(1,3,2);
imshow(log(1+abs(f3)),[]);
title('幅度图像');
subplot(1,3,3);
imshow(f4);
title('相位图像');

ここに画像の説明を挿入

(2) 位相部分のみを逆フーリエ変換した画像を表示します。
lena=imread("lena.jpg");
lena_gray=rgb2gray(lena);
f1=fft2(lena_gray); %快速傅里叶变换
f=ifft(abs(f1));
figure,subplot(1,3,1);
imshow(lena_gray);
title('原始图像');
subplot(1,3,2);
imshow(log(1+abs(f3)),[]);
title('振幅图像');
subplot(1,3,3);
imshow(log(1+abs(f)),[]);
title('相位图像');

ここに画像の説明を挿入

(3) 振幅部分のみを逆フーリエ変換した画像を確認します。
lena=imread("lena.jpg");
lena_gray=rgb2gray(lena);
f1=fft2(lena_gray); %快速傅里叶变换
f2=log(1+abs(f1));
f3=fftshift(f1);
f4=angle(f1);
f5=-f4;
f6=double(f3*exp(f4));   %傅里叶变换的复共轭
f7=ifft2(f6);   %反傅里叶变换
figure,subplot(1,2,1);
imshow(lena_gray);
title('原始图像');
subplot(1,2,2);
imshow(real(f7),[]);
title('逆傅里叶变换');

ここに引用があります

(4) 画像のフーリエ変換をその共役に設定し、逆変換を実行して、新しく生成された画像と元の画像の差を比較します。
lena=imread("lena.jpg");
lena_gray=rgb2gray(lena);
f1=fft2(lena_gray); %快速傅里叶变换
f2=log(1+abs(f1));
f3=fftshift(f1);
f4=angle(f1);
f5=f4;
f6=double(f3*exp(f4));  %傅里叶变换的复共轭
figure,subplot(1,2,1);
imshow(lena_gray);
title('原始图像');
subplot(1,2,2);
imshow(real(f7),[]);
title('逆傅里叶变换');

ここに画像の説明を挿入

4. スムーズな周波数領域フィルタリング

(1) オプションのカットオフ周波数を使用して、理想的なローパス フィルター、バターワース ローパス フィルターおよびガウス ローパス フィルターを設計します。
%理想低通滤波器的透视图
a=100;
b=100;
U=0:a;
V=0:b;
M=length(U);
N=length(V);
D0=10;  %D0是频带的中心半径
x1=50;
y1=50;
x0=-50;
y0=-50;
m=fix(M/2);
n=fix(N/2);
H=zeros(M,N);
n=2;
for u=1:M
    for v=1:N
        a=sqrt((U(u)-50).*(U(u)-50)+(V(v)-50).*(V(v)-50));  %(u,v)的值
        if(a<=D0)   %理想滤波器
            H(u,v)=1;
        else
            H(u,v)=0;
        end
    end
end
figure,subplot(1,3,1);
surf(U,V,H);
title('理想低通滤波透视图');
%巴特沃斯低通滤波器透视图
a=100;    
b=100;    
U=0:a;    
V=0:b;    
M=length(U);N=length(V);    
D0=10;%W=200;%D0 是频带的中心半径;W 是频带的宽度
x1=50;y1=50;    
x0=-50;y0=-50;    
m=fix(M/2); 
n=fix(N/2);    
H=zeros(M,N);    
n=2;    
for u=1:M    
    for v=1:N    
        a=sqrt((U(u) - 50) .* (U(u)-50) + (V(v) - 50) .* (V(v) - 50));%D(u,v)的值
        b=1+(a/D0)^2*n;    
        H(u,v)=1/b;  
    end    
end    
subplot(1,3,2);
surf(U,V,H);  
title('巴特沃斯低通滤波器透视图');
%高斯低通滤波
a=100;    
b=100;    
U=0:a;    
V=0:b;    
M=length(U);
N=length(V);    
D0=10; %D0 是频带的中心半径
x1=50;
y1=50;    
x0=-50;
y0=-50;    
m=fix(M/2);
n=fix(N/2);    
H=zeros(M,N);          
for u=1:M    
    for v=1:N    
        D1=((u-m-x0)^2+(v-n-y0).^2)^0.5;    
        D2=((u-m+x0)^2+(v-n+y0).^2)^0.5;    
        D11=((u-m-x1)^2+(v-n-y1).^2)^0.5;    
        D21=((u-m+x1)^2+(v-n+y1).^2)^0.5;    
        H(u,v) = (U(u) - 50) .* (U(u)-50) + (V(v) - 50) .* (V(v)  - 50);   
    end    
end   
S=50;    
H = -H/(2*S);    
H = exp(H) / (sqrt(2*pi) * sqrt(S));    
subplot(1,3,3),surf(U,V,H),title('高斯低通滤波');

ここに引用があります

(2) グレースケール画像を読み出し、理想ローパス フィルター、バターワース ローパス フィルター、ガウス ローパス フィルターでそれぞれフィルター処理し (カットオフ周波数はオプション)、逆変換を実行して画像間の違いを観察します。カットオフ周波数と元の画像で異なるローパス フィルターを使用して得られた画像では、リンギング効果に特に注意してください。
%d0=15 理想低通滤波
lena=imread("lena.jpg");
lena_gray=rgb2gray(lena);
f=double(lena_gray);
g=fft2(f);  %傅里叶变换
g=fftshift(g);
[M,N]=size(g);
d0=15;
m=fix(M/2);
n=fix(N/2);
for i=1:M
    for j=1:N
        d=sqrt((i-m)^2+(j-n)^2);
        if(d<d0)
            h=1;
        else
            h=0;
        end
        result(i,j)=h*g(i,j);
    end
end
result=ifftshift(result);
J1=ifft2(result); 
J2=uint8(real(J1));  
figure,subplot(2,2,1);
imshow(lena);
title('原始图像'); 
subplot(2,2,2);
imshow(J2);
title('d0=15 理想低通滤波器');
%d0=30 的理想低通滤波
d0=30;  
m=fix(M/2); 
n=fix(N/2); 
for i=1:M  
    for j=1:N  
        d=sqrt((i-m)^2+(j-n)^2);  
        if(d<=d0)  
            h=1;  
        else   
            h=0;  
        end  
        result(i,j)=h*g(i,j);  
    end 
end  
result=ifftshift(result); 
J1=ifft2(result); 
J2=uint8(real(J1));  
subplot(2,2,3);
imshow(J2);
title('d0=30 理想低通滤波器');
%d0=100 的理想低通滤波
d0=100;  
m=fix(M/2); 
n=fix(N/2); 
for i=1:M  
    for j=1:N  
        d=sqrt((i-m)^2+(j-n)^2);  
        if(d<=d0)  
            h=1;  
        else   
            h=0;  
        end  
        result(i,j)=h*g(i,j);  
    end 
end  
result=ifftshift(result); 
J1=ifft2(result); 
J2=uint8(real(J1));  
 subplot(2,2,4);
 imshow(J2);
 title('d0=100 理想低通滤波器');

ここに引用があります
カットオフ周波数d0=15が高くなる、フィルタリングされた画像がぼやけ、リンギング現象も顕著d0=30になりますが、このとき、画像のぼやけ度合いは弱まりますが、リンギング現象はまだ存在します。このd0=100時点では、フィルタリングされた画像は比較的鮮明でしたが、高周波成分が失われた後でも、画像の端にわずかなリンギングが残っていました。

5. 周波数領域フィルタリングを強化する

(1) オプションのカットオフ周波数を使用して、理想的なハイパス フィルター、バターワース ハイパス フィルター、ガウス ハイパス フィルターを設計します。
lena=imread("lena.jpg");
lena_gray=rgb2gray(lena);
f=double(lena_gray);
g=fft2(f);  %傅里叶变换
g=fftshift(g);
[M,N]=size(g);

%d0=15的巴特沃斯高通滤波器
nn=2;
d0=15;
m=fix(M/2);
n=fix(N/2); 
for i=1:M  
    for j=1:N  
        d=sqrt((i-m)^2+(j-n)^2);  
        h=1/(1+0.414*(d/d0)^(2*nn));  
        result(i,j)=h*g(i,j);  
    end 
end  
result=ifftshift(result); 
J1=ifft2(result); 
J2=uint8(real(J1));

figure,subplot(2,2,1);
imshow(lena);
title('原始图像'); 
subplot(2,2,2);
imshow(J2);
title('d0=15 巴特沃斯高通滤波器')
%d0=30的巴特沃斯高通滤波器
d0=30;  
m=fix(M/2);
n=fix(N/2); 
for i=1:M  
    for j=1:N  
        d=sqrt((i-m)^2+(j-n)^2);  
        h=1/(1+0.414*(d/d0)^(2*nn));  
        result(i,j)=h*g(i,j);  
    end 
end  
result=ifftshift(result); 
J1=ifft2(result);
J2=uint8(real(J1));   
subplot(2,2,3);
imshow(J2);
title('d0=30 巴特沃斯高通滤波器');
%d0=100的巴特沃斯高通滤波器
d0=100;  
m=fix(M/2);
n=fix(N/2); 
for i=1:M  
    for j=1:N  
        d=sqrt((i-m)^2+(j-n)^2);  
        h=1/(1+0.414*(d/d0)^(2*nn));  
        result(i,j)=h*g(i,j);  
    end 
end  
result=ifftshift(result); 
J1=ifft2(result);
J2=uint8(real(J1));   
subplot(2,2,4);
imshow(J2);
title('d0=100 巴特沃斯高通滤波器');
%d0=15的高斯低通滤波
d0=15;  
m=fix(M/2);
n=fix(N/2); 
for i=1:M  
    for j=1:N  
        d=sqrt((i-m)^2+(j-n)^2);  
        h=exp(-(d.^2)./(2*(d0^2)));  
        result(i,j)=h*g(i,j);  
    end 
end  
result=ifftshift(result); 
J1=ifft2(result);
J2=uint8(real(J1)); 
figure,subplot(2,2,1);
imshow(lena);
title('原始图像'); 
subplot(2,2,2);
imshow(J2);
title('d0=15 高斯高通滤');  
%d0=30的高斯低通滤波
d0=30;  
m=fix(M/2);
n=fix(N/2); 
for i=1:M  
    for j=1:N  
        d=sqrt((i-m)^2+(j-n)^2);  
        h=exp(-(d.^2)./(2*(d0^2)));  
        result(i,j)=h*g(i,j);  
    end 
end  
result=ifftshift(result);
J1=ifft2(result);
J2=uint8(real(J1)); 
subplot(2,2,3);
imshow(J2);
title('d0=30 高斯高通滤波');  
%d0=100的高斯低通滤波 
d0=100;  
m=fix(M/2);
n=fix(N/2); 
for i=1:M  
    for j=1:N  
        d=sqrt((i-m)^2+(j-n)^2);  
        h=exp(-(d.^2)./(2*(d0^2)));  
        result(i,j)=h*g(i,j);  
    end 
end  
result=ifftshift(result); 
J1=ifft2(result);
J2=uint8(real(J1));   
subplot(2,2,4);
imshow(J2);
title('d0=100 高斯高通滤波');

ここに画像の説明を挿入

(2) グレースケール画像を読み出し、理想ハイパス フィルター、バターワース ハイパス フィルター、ガウス ハイパス フィルターでそれぞれフィルター処理し (カットオフ周波数はオプション)、逆変換を実行してさまざまなカットオフ周波数の違いを観察します。異なるハイパスフィルターを使用して得られた画像と元の画像との間の差異。
close all
lena=imread('lena.jpg');    %将原始图像读入
lena_gray=rgb2gray(lena);   %将图像灰度化
lena_double=double(lena_gray);
g=fft2(f);  %傅里叶变换
g=fftshift(g);
[M,N]=size(g);
%d0=15的理想高通滤波器
d0=15;
m=fix(M/2);
n=fix(N/2); 
for i=1:M  
    for j=1:N  
        d=sqrt((i-m)^2+(j-n)^2);
        if(d>=d0)
            h=1;
        else
            h=0;
        end
        result(i,j)=h*g(i,j);
    end
end
result=ifftshift(result);
J1=ifft2(result);
J2=uint8(real(J1));
figure,subplot(2,2,1);
imshow(lena);
title('原始图像');
subplot(2,2,2);
imshow(J2);
title('d0=15 理想高通滤波器');
%d0=30的理想高通滤波器
d0=30;
m=fix(M/2);
n=fix(N/2); 
for i=1:M  
    for j=1:N  
        d=sqrt((i-m)^2+(j-n)^2);
        if(d>=d0)
            h=1;
        else
            h=0;
        end
        result(i,j)=h*g(i,j);
    end
end
result=ifftshift(result);
J1=ifft2(result);
J2=uint8(real(J1));
subplot(2,2,3);
imshow(J2);
title('d0=30 理想高通滤波器');
%d0=80的理想高通滤波器
d0=80;
m=fix(M/2);
n=fix(N/2); 
for i=1:M  
    for j=1:N  
        d=sqrt((i-m)^2+(j-n)^2);
        if(d>=d0)
            h=1;
        else
            h=0;
        end
        result(i,j)=h*g(i,j);
    end
end
result=ifftshift(result);
J1=ifft2(result);
J2=uint8(real(J1));
subplot(2,2,4);
imshow(J2);
title('d0=80 理想高通滤波器');
%d0=15的巴特沃斯高通滤波器
nn=2;
d0=15;
m=fix(M/2);
n=fix(N/2);
for i=1:M
    for j=1:N
        d=sqrt((i-m)^2+(j-n)^2);
        if(d==0)
            h=0;
        else
            h=1/(1+0.414*(d0/d)^(2*nn));
        end
        result(i,j)=h*g(i,j);
    end
end
result=ifftshift(result);
J1=ifft2(result);
J2=uint8(real(J1));
figure,subplot(2,2,1);
imshow(lena);
title('原始图像');
subplot(2,2,2);
imshow(J2);
title('d0=15 巴特沃斯高通滤波')
%d0=30的巴特沃斯高通滤波器
d0=30;
m=fix(M/2);
n=fix(N/2);
for i=1:M
    for j=1:N
        d=sqrt((i-m)^2+(j-n)^2);
        if(d==0)
            h=0;
        else
            h=1/(1+0.414*(d0/d)^(2*nn));
        end
        result(i,j)=h*g(i,j);
    end
end
result=ifftshift(result);
J1=ifft2(result);
J2=uint8(real(J1));

subplot(2,2,3);
imshow(J2);
title('d0=30 巴特沃斯高通滤波')
%d0=80的巴特沃斯高通滤波器
d0=80;
m=fix(M/2);
n=fix(N/2);
for i=1:M
    for j=1:N
        d=sqrt((i-m)^2+(j-n)^2);
        if(d==0)
            h=0;
        else
            h=1/(1+0.414*(d0/d)^(2*nn));
        end
        result(i,j)=h*g(i,j);
    end
end
result=ifftshift(result);
J1=ifft2(result);
J2=uint8(real(J1));
subplot(2,2,4);
imshow(J2);
title('d0=80 巴特沃斯高通滤波')

ここに引用があります

おすすめ

転載: blog.csdn.net/weixin_51571728/article/details/124713971