根据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)不能适合边缘处的图像。只过滤其邻居可以全部包含在权重矩阵(或掩码)中的像素被过滤。
答案 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,从而保留当地平均值。