正如@EitanT 指出的那样,您可以使用blockproc 对图像进行批量块处理J. 但是您应该将函数句柄定义为
fun = @(block_struct) fft2(block_struct.data);
B = blockproc(J, [64 10], fun);
对于[2000 x 500] 矩阵,这将为您提供复杂傅立叶值的[2000 x 500] 输出,在局部支持(FFT 的输入大小)为[64 x 10] 的子采样像素位置进行评估。现在,用单个值替换这些值,例如使用峰值对数幅度,您可以进一步指定
fun = @(block_struct) max(max(log(abs(fft2(block_struct.data)))));
B = blockproc(J, [64 10], fun);
然后输出是块补丁值的 [2000/64 x 500/10] 输出,您可以通过最近邻插值(或其他更平滑的版本)将其大小调整为所需的 [2000 x 500] 原始值大小
C = imresize(B, [2000 500], 'nearest');
如果有进一步的帮助,我可以提供一个真实的图像示例。
更新:要获得重叠块,您可以使用blockproc 的'Bordersize' 选项,方法是设置重叠[V H],这样最终窗口大小[M + 2*V, N + 2*H] 仍将是[64 , 10] 大小。示例:
fun = @(block_struct) log(abs(fft2(block_struct.data)));
V = 16; H = 3; % overlap values
overlap = [V H];
M = 32; N = 4; % non-overlapping values
B1 = blockproc(J, [M N], fun, 'BorderSize', overlap); % final windows are 64 x 10
但是,这将适用于保留完整的傅立叶响应,而不是上面带有 max(max()) 的单值版本。
另请参阅此帖子以使用 blockproc:Dealing with “Really Big” Images: Block Processing 进行过滤。