将 1D 窗口函数扩展到 3D(或更高)

信息处理 窗函数 3d 线性代数
2022-01-31 11:20:55

(SO的交叉帖子:https ://stackoverflow.com/questions/27345861/extending-1d-function-across-3-dimensions-for-data-windowing )

为了图像(体积)配准,我想对输入数据应用一个窗口函数,这样非周期性图像边界不会导致 FFT 中出现条纹。我将此处的示例用于 2D 数据:

http://mail.scipy.org/pipermail/numpy-discussion/2008-July/036112.html

h = scipy.signal.hamming(n)
ham2d = sqrt(outer(h,h))

这可以扩展到 3D 甚至 ND 吗?

4个回答

这个问题很老,但我需要相同的功能。

我写了一个接收一维窗口作为参数并转换为立方体窗口的函数

function [win] = window3D(w)

    L = size(w,1);
    m1 = w(:)*w(:).';
    win1 = repmat(m1, [1 1 L]);
    m2 = w(:)*ones(1,L);
    win2 = repmat(m2, [1 1 L]);
    win2 = permute(win2, [3, 2, 1]);
    win = win1.*win2;
end

对于那些想要天使答案的 Python 版本的人,这里是:

import numpy as np

def window3D(w):
    # Convert a 1D filtering kernel to 3D
    # eg, window3D(numpy.hanning(5))
    L=w.shape[0]
    m1=np.outer(np.ravel(w), np.ravel(w))
    win1=np.tile(m1,np.hstack([L,1,1]))
    m2=np.outer(np.ravel(w),np.ones([1,L]))
    win2=np.tile(m2,np.hstack([L,1,1]))
    win2=np.transpose(win2,np.hstack([1,2,0]))
    win=np.multiply(win1,win2)
    return win

是的,窗口函数只是将加权函数应用于您的数据。

对于 ND 数据,您可以将窗口函数视为 N 个相互正交的一维窗口的组合。

由于一维窗口的权重不依赖于其他维度,您可以单独应用每个维度或将它们组合以获得单个 ND 窗口。

例如对于 3D(在 matlab 中,它应该足够简单以转换为 python)

hammx=hamming(L); %1D window
hammy=hamx';
hamz=permute(hamx, [3, 2, 1]);
ham2=ones(L);
ham3=ones(L, L, L);
for i=1:100               % there is probably a much better way to compute this
ham2(i, :)=hamx(i).*hamy;
for j=1:100
ham3(i, j, :)=ham2(i, j).*hamz;
end
end

可分离扩展是微不足道的:您可以获得具有一维窗口乘积的 nD 窗口,并且它们可以不同以考虑图像或体积各向异性等。计算速度快(可分离性),但有缺点:低秩,有时是非常快的衰减:每个维度的衰减都成倍增加。

不可分离的扩展可能很有趣。如果你有一个一维离散窗口的公式,你可以通过改变一维中心减去滞后通过 nD 中更通用的范数/准范数:. 规范的形状将驱动各向同性、衰变等。|cl|||c(x,y,z)l(x,y,z)||

你可以从一个连续的公式开始,适当地离散化和规范化它。