画像 ラドン変換とフーリエ変換 (matlab)

イメージ変更の概要

画像変換とは、画像を空間領域から変換領域に変換することです。画像変換の目的は、変換ドメインのいくつかのプロパティに従って画像を処理することです。通常、これらの特性を空間領域で取得することは困難です。変換領域での処理が完了すると、処理結果が反転されて空間領域に変換される。

私たちが見ている画像は空気領域にあり、その情報は強い相関関係を持っているため、画像情報は何らかの数学的手法によって他の直交ベクトル空間に変換されることがよくあります。一般に、元の画像を空間領域画像、変換された画像を変更領域画像と呼び、変換領域内の画像を空間領域画像に逆変換することができる。

変換された画像は、画像自体の特性を効果的に反映できる一方で、少量のデータにエネルギーを集中させることができるため、画像の保存、送信、処理に有益です。数学的な観点から見ると、画像変換とは、実際のニーズに合わせて画像内のピクセルを「別の形式」に表現することであり、処理された画像を得るには、ほとんどの場合、変換された画像を逆変換する必要があります。

画像ラドン変換

与えられた画像 f(x,y) に対して、与えられた座標系 XOY における特定の投影方向に沿った各投影線の断層面 f(x,y) の線積分を計算し、投影された上で光線を取得します。値 g(R, θ)、その式:
ここに画像の説明を挿入

ラドン順変換の実現

R = ラドン(I,theta)
[R,xp] = ラドン(...)
theta: angle
xp: 対応する座標値を返し、
画像上で 0° と 45° の方向にラドン変換を実行します。

>> I(50:150,50:150) = 1;
>> [R,xp] = radon(I,[0,45]);%Radon变换
>> figure,
>> subplot(131),imshow(I); 
>> subplot(132),plot(xp,R(:,1));%0°变换结果
>> subplot(133),plot(xp,R(:,2));%45°变换结果

ここに画像の説明を挿入

複数の角度のラドン変換を計算し、これらの曲線を座標ポンプにプロットし、画像として表します。

>> I = zeros(200,200);
>> I = ones(200,200);
>> I(50:150,50:150) = 0;
>> theta = 0:10:180;
>> [R,xp] = radon(I,theta);
>> figure,
>> subplot(121),imshow(I);
>> subplot(122),imagesc(theta,xp,R);%绘制各个角度的Radon变换结果
>> colormap(hot);%设置调色板
>> colorbar;%添加颜色条

ここに画像の説明を挿入
ラドン変換による直線の検出:

>> I = imread('E:\persional\matlab\images\house.tif');
>> J = im2double(I);
>> BW = edge(J);%获取边缘
>> figure,
>> subplot(121),imshow(J);
>> subplot(122),imshow(BW);
>> theta = 0:179;%角度
>> [R,xp] = radon(BW,theta);%Radon变换
>> figure,
>> imagesc(theta,xp,R);%显示变换结果
>> colormap(hot);%添加调色板
>> colorbar;%添加颜色条
>> Rmax = max(max(R));%获取最大值
>> [row,column] = find(R>=Rmax);%获取行和列值
>> x = xp(row);%获取位置
>> angel = theta(column);获取角度
>> Rmax

Rmax =

   188

>> row

row =

   649

>> column

column =

     1

>> x

x =

   222

>> angel

angel =

     0

ここに画像の説明を挿入
ラドン変換は角度 0° ~ 179° ごとに実行されます。明るい色は係数が大きいことを示します。この点に対応する直線は、元の画像で最も明白な直線です。ラドン変換結果の最大値は 188、角度 0、x=222 です。
ここに画像の説明を挿入

ラドン逆変換の実現

I = iradon(R,theta)
R: ラドン変換行列、theta は角度です

逆ラドン変換により画像を復元します。

>> I = imread('E:\persional\matlab\images\house.tif');
>> theta = 0:2:179;
>> [R,xp] = radon(I,theta);%Radon变换
>> J = iradon(R,theta);%Radon反变换
>> figure,
>> subplot(131),imshow(uint8(I));
>> subplot(132),imagesc(theta,xp,R);%变换结果
>> axis normal;
>> subplot(133),imshow(uint8(J));

ここに画像の説明を挿入

ラドン変換画像と逆変換画像の投影角度はどのくらいですか:

>> I=phantom(256);
>> theta1 = 0:10:179;
>> theta2 = 0:5:179;
>> theta3 = 0:2:179;
>> [R1,xp] = radon(I,theta1);
>> [R2,xp] = radon(I,theta2);
>> [R3,xp] = radon(I,theta3);
>> figure,%显示不同角度得Radon变换
>> subplot(221),imshow(I);
>> subplot(222),imagesc(thetal,xp,R1);
>> subplot(223),imagesc(theta2,xp,R2);
>> subplot(224),imagesc(theta3,xp,R3);
>>> colormap hot;
>> colorbar;

ここに画像の説明を挿入

>> J1 = iradon(R1,10);
>> J2 = iradon(R2,5);
>> J3 = iradon(R3,2);
>> figure,
>> subplot(131),imshow(J1);%显示图像进行Radon反变换
>> subplot(132),imshow(J2);
>> subplot(133),imshow(J3);

使用する角度が多いほど (角度間隔が狭いほど)、画像はより鮮明になります。
ここに画像の説明を挿入

画像フーリエ変換

フーリエ変換は、画像分析、画像強調、画像圧縮に一般的に使用される直交変換です。

離散シーケンス f(x) の場合、その 1 次元離散フーリエ変換は次のように定義されます。 ここで、N は長さ、μ=0,1,...,N-1 F(u) および 1 次元離散フーリエ
ここに画像の説明を挿入
変換逆変換は次のように定義されます:
ここに画像の説明を挿入
連続フーリエ変換と同じ、離散関数 f(x,y) の場合、x = 0,1,…,M-1; y = 0,1,…,N-1、2 次元離散フーリエ変換 変換は次のように定義されます: ここで、 μ = 0,1,…,M-1; v = 0,1,…,N-1
ここに画像の説明を挿入
F(u,v) の 2 次元逆離散フーリエ変換は次のように定義されます。として: x = 0,1,...,M-1; y = 0,1,...,N-1、u と v は周波数変数 2 次元フーリエ変換のプロパティです: 分離性、線形
ここに画像の説明を挿入
性、共役対称性、変位、スケール変換性、回転不変性、巻線および DC 係数

フーリエ変換の実装

Y = fft2(X)
Y = fft2(X,m,n)
X: Y と同じサイズの計算行列
m,n: Express FFT アルゴリズムを使用して、行列サイズ m×の 2 次元離散フーリエ変換を計算しますn 、行列が m×n より小さい場合は 0 で埋めます

行列の 2D 離散フーリエ変換

>> I1 = ones(4);
>> I2 = [2 2 2 2;1 1 1 1;3 3 0 0;0 0 0 0];
>> J1 = fft2(I1);%傅里叶变换
>> J2 = fft2(I2);
>> I1

I1 =

     1     1     1     1
     1     1     1     1
     1     1     1     1
     1     1     1     1

>> J1

J1 =

    16     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     0     0

>> I2

I2 =

     2     2     2     2
     1     1     1     1
     3     3     0     0
     0     0     0     0

>> J2

J2 =12

  18.0000 + 0.0000i   3.0000 - 3.0000i
   2.0000 - 4.0000i  -3.0000 + 3.0000i
  10.0000 + 0.0000i   3.0000 - 3.0000i
   2.0000 + 4.0000i  -3.0000 + 3.0000i

  列 34

   0.0000 + 0.0000i   3.0000 + 3.0000i
   0.0000 + 0.0000i  -3.0000 - 3.0000i
   0.0000 + 0.0000i   3.0000 + 3.0000i
   0.0000 + 0.0000i  -3.0000 - 3.0000i

画像の 2D 離散フーリエ変換

>> I=imread('E:\persional\matlab\images\lena.bmp');
>> I=imread('E:\persional\matlab\images\house.tif');
>> I = im2double(I);
>> J = fft2(I);%傅里叶变换
>>> K = abs(J/256);
>> figure,
>> subplot(131),imshow(I);
>> subplot(132),imshow(J);
>> subplot(133),imshow(K);%频谱图

ここに画像の説明を挿入
fft2shift を使うと座標原点をスペクトログラムウィンドウの中心に移動できます 座標原点が低周波、外側が高周波
Y = fft2shift(X)
X: フーリエ変換後の結果
Y: ゼロ補正後の画像スペクトル分布周波数
はOK iffshift()関数によるフーリエ逆変換

関数 ffshift() を使用して変換します。

>> N=0:10;
>> X = fftshift(N);%平移
>> Y = fftshift(fftshift(N));%平移后在平移
>> Z = ifftshift(fftshift(N));%平移后再进行反平移
>> N

N =18

     0     1     2     3     4     5     6     7911

     8     9    10

>> X

X =18

     6     7     8     9    10     0     1     2911

     3     4     5

>> Y

Y =18

     1     2     3     4     5     6     7     8911

     9    10     0

>> Z

Z =18

     0     1     2     3     4     5     6     7911

     8     9    10

>> 

画像はフーリエ変換され、変換されます

>> I=imread('E:\persional\matlab\images\paopao.tif');
>> K = fft2(J);%傅里叶变换
>> K = fftshift(K);%平移
>> L = abs(K/256);
>> figure,
>> subplot(121),imshow(I);
>> subplot(122),imshow(L);

ここに画像の説明を挿入
画像が明るくなり、フーリエ変換されます。

>> I=imread('E:\persional\matlab\images\paopao.tif');
>> J = I*1.5;%图像增强
>> J(find(J>255))=255;
>> K=fft2(J);%傅里叶变换
>> K=fftshift(K);%平移
>> L=abs(K/256);
>> figure,
>> subplot(121),imshow(J);
>> subplot(122),imshow(uint8(L));%显示频谱图

ここに画像の説明を挿入
画像の回転後にフーリエ変換を実行します。

>> I=imread('E:\persional\matlab\images\paopao.tif');
>> J = imrotate(I,45,'bilinear');%图像旋转
>> K = fft2(J);%傅里叶变换
>> K = fftshift(K);%平移
>> L = abs(K/256);
>> figure,
>> subplot(121),imshow(J);
>> subplot(122),imshow(uint8(L));%显示频谱图

ここに画像の説明を挿入
画像はガウス ノイズを追加した後にフーリエ変換されます。

>> I=imread('E:\persional\matlab\images\paopao.tif');
>> J = imnoise(I,'gaussian',0,0.01);%添加噪声
>> K = fft2(J);%傅里叶变换
>> K = fftshift(K);%平移
>> L = abs(K/256);
>> figure,
>> subplot(121),imshow(J);
>> subplot(122),imshow(uint8(L));%显示频谱图

ここに画像の説明を挿入

2D 逆高速フーリエ変換

Y = ifft2(X);
Y = ifft2(X,m,n)
この関数は fft2() の逆関数です
X: 計算行列、Y と同じサイズ
m,n: 高速 FFT アルゴリズムを使用し、計算行列はm×nの2次元離散フーリエ変換であり、行列がm×nより小さい場合は0で埋められます。

>> I=imread('E:\persional\matlab\images\paopao.tif');
>> K = fft2(I);%傅里叶变换
>> L = fftshift(K);%平移
>> M = ifft2(K);%傅里叶反转函数
>> figure,
>> subplot(121),imshow(uint8(abs(L)/256));%显示频谱图
>> subplot(122),imshow(uint8(M));%反转后得到的图像

ここに画像の説明を挿入
グレースケール画像の振幅と位相のスペクトル:

>> I=imread('E:\persional\matlab\images\paopao.tif');
>> K = fft2(I);
>> L = fftshift(K);
>> fftr = real(L);%返回数组每个元素的实部
>> ffti = imag(L);%返回数组每个元素的虚部
>> A = sqrt(fftr.^2+ffti.^2);%幅值谱
>> A = (A-min(min(A)))/(max(max(A))-min(min(A)))*255;%归一化
>> B = angle(K);%相位谱
>> figure,
>> subplot(121),imshow(A);
>> subplot(122),imshow(real(B));

ここに画像の説明を挿入

フーリエ変換による画像内の一致する画像の特定

>> I = imread('E:\persional\matlab\images\ba.tif');
>> a = imread('E:\persional\matlab\images\ball.png');
>> I = im2double(I);
>> a = rgb2gray(a);
>> a = im2double(a);
>> a = im2double(a);
>> c = real(ifft2(fft2(I).*fft2(rot90(a,2),600,600)));
>> figure,
>> subplot(121),imshow(c,[]);
>> max(c(:));
>> thresh = 1024;
>> subplot(122),imshow(c>thresh);

ここに画像の説明を挿入

画像に Barth ローパス フィルターを適用します。
ローパス フィルター: H(u,v) = 1/(1+[D(u,v)/D 0 ] 2n )
ハイパス フィルター: H(u, v) = 1/ (1+[D 0 /D(u,v)] 2n )

画像にバターワース ローパス フィルタリングを適用します。

>> I = imread('E:\persional\matlab\images\house.tif');
>> I = im2double(I);
>> J = fftshift(fft2(I));%傅里叶变换平移
>> [x,y] = meshgrid(-300:299,-300:299);%产生离散数据
>> z = sqrt(x.^2+y.^2);
>> D1 = 10;D2=30;%截至频率
>> n=6;%滤波器阶数
>> H1 = 1./(1+(z/D1).^(2*n));%滤波器
>> H2 = 1./(1+(z/D2).^(2*n));
>> K1 = J.*H1;%滤波
>> K2 = J.*H2;
>> L1=ifft2(ifftshift(K1));%傅里叶反变换
>> L2=ifft2(ifftshift(K2));
>> figure,
>> subplot(131),imshow(I);
>> subplot(132),imshow(real(L1));
>> subplot(133),imshow(real(L2));

ここに画像の説明を挿入

画像にバターワース ハイパス フィルタリングを適用します。

>> I = imread('E:\persional\matlab\images\house.tif');
>> I = im2double(I);
>> J = fftshift(fft2(I));
>> [x,y] = meshgrid(-300:299,-300:299);
>> z = sqrt(x.^2+y.^2);
>> D1 = 10;D2=30;
>> n1=2;n2=6;
>> H1 = 1./(1+(D1./z).^(2*n1));
>> H2 = 1./(1+(D2./z).^(2*n2));
>> K1 = J.*H1;
>> K2 = J.*H2;
>> L1=ifft2(ifftshift(K1));
>> L2=ifft2(ifftshift(K2));
>> figure,
>> subplot(131),imshow(I);
>> subplot(132),imshow(real(L1));
>> subplot(133),imshow(real(L2));

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_56260304/article/details/127628704