在对同一个物体进行长时间拍摄的过程中,难免会因为一些外界原因,比如,物体的移动,导致拍摄的物体在成像平面中发生移动。这时,在分析某一特定区域长时间的特性之前,要对成像得到的图像进行校正。
本文中针对二维图像水平和竖直方向移动进行校正。校正的方法有很多种,有的是通过搜索、迭代、优化,找到最优解的。而本文中采用了利用互相关的方法,可以做到在一定假设的条件下,直接得到x、y平移的数值。
1 互相关用于图像配准原理介绍
假设图像
f
2
f_2
f2是
f
1
f_1
f1经过平移得到的,那么
f
2
=
f
1
(
x
−
Δ
x
,
y
−
Δ
y
)
f_2 = f_1(x-\Delta x, y-\Delta y)
f2=f1(x−Δx,y−Δy)
根据傅里叶变换定理
F
2
(
u
,
v
)
=
F
1
(
u
,
v
)
e
−
2
π
j
(
u
Δ
x
+
v
Δ
y
)
F_2(u,v)=F_1(u,v)e^{-2\pi j (u\Delta x+v\Delta y)}
F2(u,v)=F1(u,v)e−2πj(uΔx+vΔy)
根据互相关函数的定义
R
c
c
f
(
x
,
y
)
=
f
1
(
x
,
y
)
∗
f
2
(
−
x
,
−
y
)
R_{c c f}(x,y)=f_1(x,y)*f_2(-x,-y)
Rccf(x,y)=f1(x,y)∗f2(−x,−y)
计算傅里叶变换,可得
R
c
c
f
(
u
,
v
)
=
F
1
(
u
,
v
)
F
2
∗
(
u
,
v
)
=
F
1
F
1
∗
e
2
π
j
(
u
Δ
x
+
v
Δ
y
)
=
F
(
u
,
v
)
e
2
π
j
(
u
Δ
x
+
v
Δ
y
)
R_{c c f}(u,v)=F_1(u,v)F_2^*(u,v)=F_1 F_1^*e^{2\pi j(u\Delta x+v\Delta y)}=F(u,v)e^{2\pi j(u\Delta x+v\Delta y)}
Rccf(u,v)=F1(u,v)F2∗(u,v)=F1F1∗e2πj(uΔx+vΔy)=F(u,v)e2πj(uΔx+vΔy)
其中,
F
(
u
,
v
)
=
F
1
F
1
∗
F(u,v)=F_1 F_1^*
F(u,v)=F1F1∗
将上式求反傅里叶变换,可得
R
c
c
f
(
x
,
y
)
=
F
(
x
,
y
)
∗
δ
(
x
−
Δ
x
,
y
−
Δ
y
)
=
F
(
x
−
Δ
x
,
y
−
Δ
y
)
R_{ccf}(x,y)=F(x,y)*\delta(x-\Delta x,y-\Delta y)=F(x-\Delta x,y-\Delta y)
Rccf(x,y)=F(x,y)∗δ(x−Δx,y−Δy)=F(x−Δx,y−Δy)
由自相关函数的性质可知,函数
F
(
x
,
y
)
F(x,y)
F(x,y)的峰值在原点处,因此
R
(
x
,
y
)
R(x,y)
R(x,y)的峰值出现在点
(
Δ
x
,
Δ
y
)
(\Delta x,\Delta y)
(Δx,Δy)处,也就是函数
f
2
(
x
,
y
)
f_2(x,y)
f2(x,y)的偏移量。
2 举例
例子中的图像来自文章[1],
f
1
f_1
f1和
f
2
f_2
f2是在不同时刻拍摄到的图像。两幅图像的大小均为
200
∗
200
200*200
200∗200。现在需要将其配准,其便于研究其中神经元的活动情况(荧光亮度)。
左图是
f
1
f_1
f1,右图是
f
2
f_2
f2
Matlab 代码如下
clear
tic
I1 = imread('f1.tif');%f1 (reference image)
FI1 = fft2(I1);
I2 = imread('f2.tif');%f2 (floating image)
FI2 = fft2(I2);
FR = FI1.*conj(FI2);%calculating correlation
R = ifft2(FR);
R = fftshift(R);
num = find(R==max(R(:)));
[i,j] = ind2sub(size(R), num);
offset_x = i-100
offset_y = j-100
toc
R = R/max(R(:));
figure %coefficient of correlation in spatial domain
imshow(R,[])
[X,Y] = meshgrid(1:200);
figure
mesh(X,Y,R)
figure
subplot(1,2,1)
imshow(I1-I2);title('before registration')
subplot(1,2,2)
I3 = imtranslate(I2, [2,3]);
imshow(I1-I3);title('after registration')
计算结果
offset_row = 3
offset_col = 2
Elapsed time is 0.189088 seconds.
利用校正前和校正后两幅图像的差值进行检验
从上面的图像可以看出,在经过校正后,图像的相似度提高了。
另外,Matlab官方文档中的一个例子。它利用互相关来实现寻找最优匹配的例子。其实质和图像校正是一致的,都是通过计算互相关系数,找到两幅图像之间最匹配时平移的距离。
有问题,随意提出,共同进步。
[1] Ming Li, Fang Liu, Hongfei Jiang, Tai Sing Lee, Shiming Tang (2017) Long-Term Two-Photon Imaging in Awake Macaque Monkey, Neuron