使用卡尔曼滤波器进行图像恢复

信息处理 图像处理 卡尔曼滤波器
2022-02-24 03:57:20

我一直在尝试恢复使用已知点扩散函数模糊并使用卡尔曼滤波器被噪声破坏的图像。我研究了理论并对卡尔曼滤波器的工作原理有了基本的了解。但是我找不到任何关于如何使用它来恢复图像的好材料。我尝试了一种方法,我认为图像是在没有控制信号的情况下要预测的状态,并且观察模型等于具有已知测量噪声的模糊函数,即,

X(k+1)=X(k)
Z(k)=HX(k)+R
其中,

X(k) is the 2D image
Z(k) is the observed noisy blurred image
H is the PSF
R is the noise

这是使用的代码,

I = im2double(imread('E:\Wallpapers\2.jpg'));
I = I(:,:,1);

LEN = 2;
THETA = 5;
PSF = fspecial('motion', LEN, THETA);
blurred = imfilter(I, PSF, 'conv', 'circular');

SNR = 20;
noisy = awgn1(blurred,SNR);

noise = noisy - blurred;
R = cov(noise);
H = fft2(PSF,size(I,1),size(I,2));
K = 1e5*eye(size(I));
P = 1e5*eye(size(I));
X = zeros(size(I));
S = zeros(size(I));

for i = 1 : 1000
    S = R + H*P*H';
    K = P*H'/S;
    X = X + K*(noisy - H*X);
    P = (I - K*H)*P*(I - K*H)' + K*R*K';
end

MSE_noise = sum(sum((noisy-I).^2));
MSE1_restored = sum(sum((X-I).^2));

图像充满了 NaN,这是因为K = P*H'/S缩放不当。我哪里错了?代码有问题还是我应该更改模型以恢复图像?

3个回答

关于卡尔曼滤波器的代码,除了更新估计协方差P之外,您的代码中的所有代码都可以,其中I应该是单位矩阵,而不是输入图像。

我建议您使用反卷积研究图像恢复,因为它更适合您的应用程序。卡尔曼滤波旨在去除或忽略信号中的噪声数据,但它不适合去模糊(据我所知)。

注意加性噪声,卷积掩码(您的点扩散函数),您要检索的原始图像和您拥有的模糊图像:ϵHxy

y=Hx+ϵ

反卷积允许您在知道xyH

使用 Matlab,您可以使用以下功能:

deconvreg(image, PSF)

其中PSF是点扩散滤波器的估计值,图像是模糊和嘈杂的图像。

如果您想了解更多有关该理论的信息,这称为不适定问题,您可以通过迭代过程最小化最小二乘误差来解决:

xestimated=argminx||yHx||2

在某些近似下,这可以通过 FFT 快速计算。

这并不能回答您最初关于卡尔曼滤波的问题,但我希望它会对您有所帮助!如果您有兴趣,我有关于使用逆滤波和维纳滤波进行图像恢复的文档。

您是否考虑过使用作为 Unity 矩阵?H