维纳滤波:均方误差问题

时间:2014-02-21 02:27:51

标签: matlab image-processing filtering

我正在尝试编写一个代码,使用原始的“真实”图像从图像解卷积一个仪器响应函数IRF(也称为点扩散函数,PSF),与此未知函数卷积。原始图像和回旋图像都是灰度图像,它们已经被适当地居中和缩放。真实的图像没有噪声,但另一个确实导致Wiener过滤以在获取IRF时尝试去除噪声。

参数是这样的:

t:true image

c:错综复杂的形象

T=fft2(t);
C=fft2(C);

K是标量值,即噪声与信号之比(或1 /信号与噪声,无论哪种方式适合)

我使用此过滤器进行反卷积的公式是:

L=conj(T)./(T*conj(T)+K)
IRF=L.*C

我试图做的是估计信噪比(未知),以便通过计算上面的论坛,然后计算{{1}的各种值的均方误差来找到理想的K.在K0.001之间。我有以下代码:

0.1

我在网上找到了均方误差的代码,但我相信它的错误原因我得到的是一个矢量,其条目都是相同的值。另外,我在最终图像中得到了绝对的废话,这让我相信噪音仍然存在于数据中。我认为应该如何计算会导致每个人K=linspace(0.001,0.1,100); for i=1:length(K); L=conj(T)./(T*conj(T)+K(i)); IRF=L.*C; Cv=uint8(ifft2(C)); %Mean Square Error is Here: e=uint8(t)-Cv; Ev(i)=mean(e(:))^2; end [minErrorValue minErrorPos]=min(Ev); idealK=K(minErrorPos); L=conj(T)./(T*conj(T)+idealK); IRF=L.*C; IRFfinal=ifft2(IRF); 的均方误差。还有另一种计算方法吗?

2 个答案:

答案 0 :(得分:1)

  1. 在wiener deconvolution L=conj(H)./(H*conj(H)+K);中,H = fft2(IRF)是乐器响应。并且解卷积用于在给定模糊图像和PSF的情况下估计“真实”图像。我认为您不能使用该公式来估算IRF;

  2. 代码中的所有Ev元素都是常量,因为它们只是您的真实图像和复杂图像之间的差异。试图找出K没有多大意义,因为你需要比较的是估计的IRF和真正的IRF,而后者只是未知。


  3. 确定模糊内核有两种可能的方法。

    第一个是优化目标函数:

    每个像素min(sum([c(x,y)-IRF(x,y)*t(x,y)]^2) + lambda*sum(IRF(x,y)^2));

    (x,y),其中正则化术语用于约束模糊内核的范数。

    你有:

    gradient_pixel(x,y) = -[c(x,y) - IRF(x,y)*t(x,y)]*t(x,y) + lambda*IRF(x,y);
    IRF(x,y) = IRF(x,y) - eta * gradient_pixel(x,y);
    

    迭代估计IRF

    第二种方法是使用互相关,假设IRF的大小为sIRF

    t1 = im2col(t, sIRF, 'sliding')';
    IRF1 = t1 \ c(:);
    IRF = rot90(reshape(IRF1, sIRF), 2);
    

    这很简单。

答案 1 :(得分:1)

首先,反卷积方法可用于回答2个问题:

  1. 你知道PSF / IRF /模糊内核/卷积内核(无论你怎么称呼它),你试图检索原始信号。
  2. 您知道原始信号并尝试恢复IRF。
  3. 这两种方法都是相同的,因为它们在卷积过程中的作用是对称的:

    MeasuredSignal = IRF*OriginalSignal + AdditiveNoise
    

    第二次,看起来就像你要计算的代码的第5行

    cv = ifft(T*IRF);
    e = uint8(c)-uint8(cv);
    

    否则你没有在计算错误时使用新计算的IRF ......因此是常数误差值。

    最后,这就是我不太了解的地方,在我看来,SNR或你的系数K不应该是一个常数,而是根据噪声的类型随频率而变化(例如高斯噪声的高斯形状)。如果你假设白噪声,它确实会不变......