正如@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');
如果它会进一步帮助,我可以包含一个真实的图像示例。
更新:要获得重叠块,您可以通过设置重叠使用'Bordersize'
选项,以便最终窗口大小仍为 [64, 10] 大小。例子:blockproc
[V H]
[M + 2*V, N + 2*H]
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:
处理“真正大”的图像进行过滤:块处理。