如何区分向上传播的波和向下传播的波?

信息处理 matlab 过滤器 自由度 吉布斯现象 二维
2022-01-07 09:19:20

我有一个真实的双向传播波的二维图像。我怎样才能将这个图像分成一个向上传播的波和一个向下传播的波?

这个例子在每个方向都有一个波浪。x 刻度显示时间,y 刻度显示位置,强度显示波在该位置和时间的幅度。第一张图片是我的输入。

在此处输入图像描述

但是,我不太习惯 2D 信号处理,所以我这样做的方法是将 FFT 频谱的两个象限设置为零,然后进行反向转换。我使用以下算法获得了另外两个图像:

X = fftshift(fft2( x )); % x is the input (image above)
X( 1:floor(size(X,1)/2),    1:floor(size(X,2)/2)   ) = 0; % null 1st quadrant
X( ceil(size(X,1)/2)+1:end, ceil(size(X,2)/2)+1:end) = 0; % null 3rd quadrant
y = ifft2( ifftshift(X) );
y = real( y ); % y is the output (image above)

感觉这种野蛮的方法会引入各种人工制品,所以我正在寻找更有经验的人的反馈。

  • 有没有更好的方法来实现这一目标?
  • 我应该如何“软化”与 FFT 相乘的 0/1“掩码”的边缘?
  • 输出很复杂,所以我丢弃了虚部。那是对的吗?
  • 我也有点担心噪声将不再是白色的事实,但我想除了对整个图像进行低通滤波之外,没有什么可做的。
2个回答

不要将两个象限归零,而是将它们乘以i. 那么实部将是一个图像,而虚部将是另一个图像。


X = fftshift(fft2( x )); % x is the input (image above)
X( 1:floor(size(X,1)/2),    1:floor(size(X,2)/2)   ) = ...
    X( 1:floor(size(X,1)/2),    1:floor(size(X,2)/2)   ) * 1i;
X( ceil(size(X,1)/2)+1:end, ceil(size(X,2)/2)+1:end) = ...
    X( ceil(size(X,1)/2)+1:end, ceil(size(X,2)/2)+1:end) * 1i;
y = ifft2( ifftshift(X) );
imagesc(real(y)); pause;
imagesc(imag(y)); pause;

由于这是单一操作,因此该复杂图像的能量将与原始图像的能量相同,噪声能量也是如此。虽然对我来说看起来不是很白,但似乎整行之间存在差异。

如果要消除伪影,可以使用更平滑的函数,例如光谱角度的余弦:


[rows,cols] = size(x);
IM = fft2(x);
% Create polar co-ordinate of FFT
[ux, uy] = meshgrid(([1:cols]-(fix(cols/2)+1))/(cols-mod(cols,2)), ...
    ([1:rows]-(fix(rows/2)+1))/(rows-mod(rows,2)));
ux = ifftshift(ux);   % Quadrant shift to put 0 frequency at the corners
uy = ifftshift(uy);
th = atan2(uy,ux);
r = sqrt(ux.^2 + uy.^2);
% cos^2
R2 = cos(th +pi/4).^2 + 1i*cos(th +3*pi/4).^2;
R2(1,1) = 0;
I_a = real(ifft2(R2.*IM));
I_b = imag(ifft2(R2.*IM));
imagesc(I_a); pause;
imagesc(I_b); pause;

我不认为在这种情况下能量保持不变,但假设白噪声能量,得到的两个图像的噪声应该是相似的。

使用频谱的极性形式将更容易进行实验并创建更平滑的截止。例如,您可以“缩小”过滤器的角度以进一步隔离波。

  1. 我希望这是(至少粗略地)做到这一点的最佳方式。
  2. 如果您发现需要柔化边缘,可以使用余弦滚降。
  3. 我不确定要丢弃哪个位。我会查看数据,看看大部分能量在哪里——比较只取实部和只取幅度(我猜是有符号幅度),然后看看哪个版本占图像中的能量最多。
  4. 您确定噪音将不再是白色的吗?我觉得可能还是。至少沿着你保持的径向线,你没有改变噪音分布。

你的结果在我看来相当不错。