自聚焦算法
1.算法基本原理和推导
自聚焦算法。假设一幅退化的雷达图像可以表示为
g
(
t
m
,
t
n
)
=
I
(
t
m
,
t
n
)
+
j
⋅
Q
(
t
m
,
t
n
)
g(t_m, t_n)=I(t_m, t_n)+j\cdot Q(t_m,t_n)
g(tm,tn)=I(tm,tn)+j⋅Q(tm,tn)。其中,考虑这一种典型的情况,图像的退化,是由于横向频率域中有误差相位引起的,有
g
(
t
m
,
t
n
)
=
∫
G
(
t
m
,
t
n
)
⋅
e
j
⋅
ϕ
(
f
n
)
⋅
e
j
2
π
f
n
t
n
d
f
n
(1)
g(t_m,t_n)=\int{G(t_m,t_n)\cdot e^{j\cdot \phi (f_n)}\cdot e^{j2\pi f_nt_n}df_n} \tag{1}
g(tm,tn)=∫G(tm,tn)⋅ej⋅ϕ(fn)⋅ej2πfntndfn(1)
作为最简单的一种情况,我们认为,误差函数
ϕ
(
f
n
)
\phi(f_n)
ϕ(fn)是一个二次函数,有
ϕ
(
f
n
)
=
a
⋅
f
n
2
(2)
\phi(f_n) = a\cdot f_n^2\tag{2}
ϕ(fn)=a⋅fn2(2)
对于我们而言,找到对应的
a
a
a就可以解决问题。
实际过程中,我们采用图像熵来衡量图像的质量,熵值定义为
E
=
−
∑
m
=
1
M
∑
n
=
1
N
(
∣
g
(
m
,
n
)
∣
2
E
n
⋅
l
o
g
2
∣
g
(
m
,
n
)
∣
2
E
n
)
(3)
E = -\sum_{m=1}^{M}\sum_{n=1}^{N}(\frac{{| g (m,n)|}^2}{E_n}\cdot log_2{}\frac{{|g (m,n)|}^2}{E_n}) \tag{3}
E=−m=1∑Mn=1∑N(En∣g(m,n)∣2⋅log2En∣g(m,n)∣2)(3)
其中,
E
n
=
∑
m
=
1
M
∑
n
=
1
N
∣
g
(
m
,
n
)
∣
2
(4)
E_n = \sum_{m=1}^{M}\sum_{n=1}^{N}|g(m,n)|^2\tag{4}
En=m=1∑Mn=1∑N∣g(m,n)∣2(4)
g
(
m
,
n
)
g(m,n)
g(m,n)是对
g
(
t
m
,
t
n
)
g(t_m,t_n)
g(tm,tn)离散化的结果。
对于函数的导数,我们可以采用近似
f
′
(
x
)
=
lim
Δ
→
0
f
(
x
+
Δ
x
)
−
f
(
x
)
Δ
x
≈
f
(
x
+
Δ
x
)
−
f
(
x
)
Δ
x
(5)
f^{'}(x)=\lim_{\Delta \rightarrow 0}\frac{f(x+\Delta x)-f(x)}{\Delta x}\approx \frac{f(x+\Delta x)-f(x)}{\Delta x}\tag{5}
f′(x)=Δ→0limΔxf(x+Δx)−f(x)≈Δxf(x+Δx)−f(x)(5)
2.级数反演法原理
假设一函数
f
(
x
)
f(x)
f(x)在
x
0
x_0
x0处可以用泰勒级数展开为:
f
(
x
)
=
∑
n
=
0
∞
1
n
!
f
n
(
x
0
)
(
x
−
x
0
)
n
f(x)=\sum_{n=0}^{\infin}\frac{1}{n!}f^{n}(x_0)(x-x_0)^n
f(x)=n=0∑∞n!1fn(x0)(x−x0)n
则:
f
′
(
x
)
=
∑
n
=
0
∞
1
n
!
f
n
(
x
0
)
⋅
n
⋅
(
x
−
x
0
)
n
−
1
=
∑
n
=
1
∞
1
(
n
−
1
)
!
f
n
(
x
0
)
(
x
−
x
0
)
n
−
1
=
∑
n
=
0
∞
1
n
!
f
n
+
1
(
x
0
)
(
x
−
x
0
)
n
\begin{aligned} f^{'}(x) = &\sum_{n=0}^{\infin}\frac{1}{n!}f^n(x_0)\cdot n\cdot (x-x_0)^{n-1}\\ =&\sum_{n=1}^{\infin}\frac{1}{(n-1)!}f^n(x_0)(x-x_0)^{n-1}\\ =&\sum_{n=0}^{\infin}\frac{1}{n!}f^{n+1}(x_0)(x-x_0)^{n}\\ \end{aligned}
f′(x)===n=0∑∞n!1fn(x0)⋅n⋅(x−x0)n−1n=1∑∞(n−1)!1fn(x0)(x−x0)n−1n=0∑∞n!1fn+1(x0)(x−x0)n
f
′
(
x
)
−
f
′
(
x
0
)
=
∑
n
=
1
∞
a
n
(
x
−
x
0
)
n
a
n
=
1
n
!
f
n
+
1
(
x
0
)
(6)
f^{'}(x)-f^{'}(x_0)=\sum_{n=1}^{\infin}a_n(x-x_0)^{n}\quad a_n=\frac{1}{n!}f^{n+1}(x_0) \tag{6}
f′(x)−f′(x0)=n=1∑∞an(x−x0)nan=n!1fn+1(x0)(6)
假设函数
f
′
(
x
)
f^{'}(x)
f′(x)在
x
0
x_0
x0的某一邻域内单调,则函数
f
′
(
x
)
f^{'}(x)
f′(x)在此邻域内存在反函数
f
′
−
1
(
x
)
f^{'-1}(x)
f′−1(x)。同样利用泰勒级数
f
′
−
1
(
x
)
f^{'-1}(x)
f′−1(x)在
f
′
(
x
0
)
f^{'}(x_0)
f′(x0)展开为:
x
−
x
0
=
∑
m
=
1
∞
A
m
(
f
′
(
x
)
−
f
′
(
x
0
)
)
m
(7)
x-x_0=\sum_{m=1}^{\infin}A_m(f^{'}(x)-f^{'}(x_0))^{m}\tag{7}
x−x0=m=1∑∞Am(f′(x)−f′(x0))m(7)
令
Y
=
f
′
(
x
)
−
f
′
(
x
0
)
y
=
x
−
x
0
Y=f^{'}(x)-f^{'}(x_0)\quad \quad y=x-x_0
Y=f′(x)−f′(x0)y=x−x0
联立
(
6
)
(
7
)
(6)(7)
(6)(7)可得方程组:
{
Y
=
∑
n
=
1
∞
a
n
y
n
y
=
∑
m
=
1
∞
A
m
Y
m
\begin{cases} Y = \sum_{n=1}^{\infin}a_ny^n\\ y= \sum_{m=1}^{\infin}A_mY^m \end{cases}
{Y=∑n=1∞anyny=∑m=1∞AmYm
可得:
Y
=
∑
n
=
1
∞
a
n
(
∑
m
=
1
∞
A
m
Y
m
)
n
Y=\sum_{n=1}^{\infin}a_n(\sum_{m=1}^{\infin}A_mY^m)^n
Y=n=1∑∞an(m=1∑∞AmYm)n
对应项系数相等,可解得各系数
A
m
A_m
Am:
{
1
=
a
1
A
1
0
=
a
1
A
2
+
a
2
A
1
2
0
=
a
1
A
3
+
a
2
(
A
1
A
2
+
A
2
A
1
)
+
a
3
A
1
3
0
=
a
1
A
4
+
a
2
(
A
1
A
3
+
A
2
2
+
A
3
A
1
)
+
a
3
(
3
⋅
A
1
A
1
A
2
)
+
a
4
A
1
4
⋯
\begin{cases} 1=a_1A_1\\ 0=a_1A_2+a_2A_1^2\\ 0=a_1A_3+a_2(A_1A_2+A_2A_1)+a_3A_1^3\\ 0=a_1A_4+a_2(A_1A_3+A_2^2+A_3A_1)+a_3(3\cdot A_1A_1A_2)+a_4A_1^4\\ \cdots \end{cases}
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧1=a1A10=a1A2+a2A120=a1A3+a2(A1A2+A2A1)+a3A130=a1A4+a2(A1A3+A22+A3A1)+a3(3⋅A1A1A2)+a4A14⋯
3.实验涉及到数据和结果
求得的最优值
a
=
860.2245
a=860.2245
a=860.2245。恢复的图像中右边还是有点问题(可以看到它是整个图像循环向左平移了一部分,感兴趣的同学可以看一下matlab代码。)
4.附录:对应的matlab代码
%%%%%%%%%%%%%%%%%%%
%2020.09.16 李昕
%%%%%%%%%%%%%%%%%%%
clc, clear;
load image_bad
%展现原始图图像
figure();
image(abs(image_bad));
colormap(gray(256));
image_row_fft = fft(image_bad, [], 2);
[M,N] = size(image_row_fft);
%%利用枚举法画出a-E的曲线图,粗略确定a的范围
a_begin = 850;
a_end = 870;
delta = 0.05;
index = 1;
E_mat = [];
for a = a_begin:delta:a_end
E_mat(index) = imageEntropy(a, N, image_row_fft, false);
index = index + 1;
end
figure();
plot(a_begin:delta:a_end, E_mat);
% 利用枚举法结果图形画出a=860时恢复的图片
imageEntropy(860.05, N, image_row_fft, true);
%利用级数反演法求解最优图片熵值对应的a值,精确求解a的值
%从图形上看,它是一个多峰的函数,因此初始点的选取就很重要
%%%%初始值选取->优化求解结果
%%%%853->860.2245(求解结果对应极小值点)
%%%%(865-870)->869.8797(求解结果对应极大值点)
%%%%855->864.4170(求解结果对应极大值点)
%%%%当然有很多初始点求解的结果会发散
%虽然不同的初始值可以得到不同的结果,我们应该从中选取对应图片熵最小对应的a值
a = 853;
delta_a = 0.1;
cycle = 50;
for c = 1:cycle
a_mat = zeros(1, 5);
%求1-4次导
for plus_delta_a = 0:4
a_mat(plus_delta_a+1) = imageEntropy(a+plus_delta_a*delta_a, N, image_row_fft, false);
end
d1 = diff(a_mat, 1);
d2 = diff(a_mat, 2);
d3 = diff(a_mat, 3);
d4 = diff(a_mat, 4);
%利用PDF中的联立的公式
a0 = d1(1) / delta_a;
a1 = d2(1) / (delta_a^2);
a2 = d3(1) / (2 * delta_a^3);
a3 = d4(1) / (6 * delta_a^4);
A1 = 1 / a1;
A2 = -(a2*A1^2)/a1;
A3 = -(a2*(A1*A2+A2*A1)+a3*A1^3)/a1;
a = a + (A1* (-a0)^1+A2*(-a0)^2+A3*(-a0)^3)
end
%显示最优a值对应的图像
imageEntropy(a, N, image_row_fft, true);
%计算特定a值下的图片熵以及是否显示图片
function E = imageEntropy(a, N, image_row_fft, display)
n = 1:N;
phi_mat = exp((n./N).^2 * j * a);
image_recover = ifft(image_row_fft.* phi_mat, [], 2);
if display
figure();
image(abs(image_recover));
colormap((gray(256)));
end
image_square = abs(image_recover).^2;
En = sum(image_square);
E = - sum((image_square/En).*log2(image_square/En));
end