图像处理中的二维最小均方滤波器(背景估计)

时间:2013-03-20 12:05:35

标签: matlab image-processing detection estimation

根据Mohiy M. Hadhoud的论文,我写了一个Matlab程序来使用二维LMS(TDLMS)自适应算法来实现图像背景估计。我用零来启动权重矩阵W,估计输出矩阵Y和误差矩阵e。支撑区域为5 * 5(窗口大小)。矩阵D是所需的输出,其与Y的差异被定义为误差矩阵(e)。但是,在我运行程序后,权重W和估计输出Y都是零。我不知道是不是因为W和Y在开头都是零或者程序中存在缺陷。这是我的代码:

clear; close all;
X=imread('noisySea.jpg');
[M N]=size(X);
Ns=5; % 5*5 support region
u=5*10^(-8); % step size
Y=zeros(M,N); % predicted image
Y(1:Ns,1:Ns)=X(1:Ns,1:Ns);
D=zeros(M,N);
D(2:M,2:N)=X(2:M,2:N); % D is shifted version of X
e=zeros(M,N); % error matrix
W=zeros(Ns,Ns); % weight matrix
for m=1+floor(Ns/2):M-floor(Ns/2)
    for n=1+floor(Ns/2):N-floor(Ns/2)
        for l=1:Ns
            for k=1:Ns
                Y(m,n)=Y(m,n)+W(l,k)*X(m-floor(Ns/2)+l-1,n-floor(Ns/2)+k-1);
                e(m,n)=D(m,n)-Y(m,n);
                W(l,k)=W(l,k)+u*e(m,n)*X(m-floor(Ns/2)+l-1,n-floor(Ns/2)+k-1);
            end
        end
    end
end
imshow(Y);

内部两次迭代用于计算点(m,n)处的Y值,而外部两次迭代遍历整个图像。经常使用诸如m = 1 + floor(Ns / 2)的代码,因为权重矩阵(5 * 5)不能适合边缘处的图像。只过滤其邻居可以全部包含在权重矩阵(或掩码)中的像素被过滤。

3 个答案:

答案 0 :(得分:1)

您的程序出现问题,编程TDLMS的正确方法是: •过滤:计算标量输出Y(m,n), •从期望的D(m,n)中减去输出Y(m,n)以计算标量误差e(m,n) •更新过滤器权重

执行程序内部计算部分的正确方法如下:

对于m = 1 + floor(Ns / 2):M-floor(Ns / 2)

for n=1+floor(Ns/2):N-floor(Ns/2)

表示l = 1:Ns

        for k=1:Ns

           Y(m,n)=Y(m,n)+W(l,k)*X(m-floor(Ns/2)+l-1,n-floor(Ns/2)+k-1);

        end

    end

E(M,N)= d(M,N)-Y(M,N);

        for l=1:Ns

        for k=1:Ns

         W(l,k)=W(l,k)+u*e(m,n)*X(m-floor(Ns/2)+l-1,n-floor(Ns/2)+k-1);

        end 
    end

端 端

答案 1 :(得分:0)

我看到的第一个问题是你对结果,错误矩阵和权重的更新从未真正更新过。第一步是将X转换为double,因此将第二行更改为:

X = cast(imread('noisySea.jpg'), 'double');

在做这个之前先捅一下然后了解发生了什么。例如,不管X中有什么:

u*e(m,n)*X(m-floor(Ns/2)+l-1,n-floor(Ns/2)+k-1)0

你可以稍微分解一下,然后看看:

u * e(m,n)并看到它表现得恰到好处。

当你引入X的引用时,你最终会将精度降低到'小数'*'较大数字'为0的点。

答案 2 :(得分:0)

好的,还有一些东西。我想你在1988年5月出版的IEEE电路与系统交易论文第35卷第5期中提到了Hadhoud和Thomas的论文。我看到至少还有一些错误,但我只在几分钟内阅读了论文

D(2:M,2:N)=X(2:M,2:N); % D is shifted version of X

你实际上并没有在这里进行转变,在论文中,在X和Y方向上有一个像素的移位。

D(2:M,2:N)=X(1:M-1,1:N-1); % D is a shiftier version of X

他们还通过在原始图像的10行上运行算法来初始化权重W,从0权重矩阵开始。

我也相信(不是100%肯定)你的体重udpate是不正确的。你的权重不断更新,这会在算法中引入一些奇怪的瑕疵。从我对该论文的简要阅读中,权重仅在您的n循环迭代时更新。权重也会按比例缩放,以使其总和为1,从而保留当地平均值。