在20x20块40x100图像上对blockproc fft2生成的矩阵的fft2s求平均值?

时间:2014-08-28 18:57:12

标签: image matlab image-processing fft

我对matlab和图像处理比较陌生,所以请耐心等待 我想要做的是表征图像中的噪声,特别是通过平均高噪声发生的区域的fft。

img = img(1:40,1:100)
imshow(img);
ffts = blockproc(img, [20 20], @(block_struct) fftshift(fft2(block_struct.data)));
// fft = imresize(ffts, [40 100], 'nearest');

基本上,此代码占据图像的左上角40 x 100部分,然后对计算fft2的该区域的每个20 x 20子部分执行块处理。希望到目前为止,我的逻辑听起来还不错。

我想知道的是,是否有任何方法可以使用内置的matlab功能执行40 x 100 fft矩阵的20 x 20子部分的平均fft2。我知道这可以通过循环相对容易地完成,但我希望尽可能简化我的代码中的解决方案。

我已经阅读了一些手册,很明显有一些matlab函数可以执行此操作;但是,到目前为止,我对我的申请并不完全有信心。欢迎任何指示!

1 个答案:

答案 0 :(得分:2)

这可以通过3行代码轻松完成。


第1行

首先使用im2col将每个20 x 20的不同块邻域重新整形为一列。因此,此输出将是400 x N矩阵,其中每列表示已重新整形为列的唯一块邻域。每列将有400行,因为每个邻域有400个元素(20 x 20)。 N将是我们40 x 100图片中的唯一区块总数。这将达到10,因为我们可以根据20 x 20要求水平放置2个块,垂直放置5个块。

第2行

im2col的输出有什么好处,im2col的i th 行告诉你 i th 元素,用于图片中的每个块。因此,您接下来要做的就是获取每一行,对所有列进行平均。输出将是400 x 1向量,表示所有块的平均FFT。这可以使用mean并指定我们想要对第二维(第二个参数为2)进行平均来实现,这是列。

第3行

然后,我们需要将其重新整形为20 x 20矩阵,因此请使用reshape执行此操作。在给定20 x 20元素向量的情况下,我们指定输出矩阵为400 x 1

您可能会问的一个问题是,此重新排序是否可以保证正确重新排序我们的FFT块。这是有保证的,因为当im2col将每个块构建到一列中时,它会以 column-major 顺序进行。这意味着对于一列块,我们逐行构造它们。一旦我们得到20 x 20个不同的块集,就会对这些块进行排列,以便按列主顺序进行采样。这意味着单个20 x 20块被构建到400 x 1列向量中,其中20 x 20块的列从左到右堆叠在一起。因此,通过执行meanreshape,每个块的空间位置确实相互对应,从而产生正确的答案。


不用多说,这是代码:

colBlocks = im2col(ffts, [20 20], 'distinct'); %// Line 1
meanCol = mean(colBlocks, 2); %// Line 2
fftBlockAverage = reshape(meanCol, [20 20]); %// Line 3

次要副作用

因为FFT本质上是复数值,所以通过平均值,您可以分别对实部和虚部进行平均。这就是MATLAB处理复数值数据平均值的方法。在计算平均2D FFT块之后,我不确定您将执行什么分析,但在进一步进行分析之前请记住这一点。


旁注

早期回答中的

Divakar创建了im2col更高效的实现。如果您没有安装图像处理工具箱,这将特别有用。您可以查看该实施here。已经证明,该函数与MATLAB的im2col之间的时间间隔更快。

基准

作为奖励,这是使用他的代码的基准。时间结果是使用40 x 100矩阵进行的,其中im2col内置函数是定时的,而Divakar的自定义函数则是。结果表明他的方法更快。在考虑更大尺寸的图像时,这可能非常有用。但是,如果您正在寻找简洁,请使用我所写的内容。如果你想要快速的东西,请使用他的方法。

基准代码

%// Input Parameters
nrows = 20;
ncols = 20;
A = rand(40,100);

disp('------------------------- With IM2COL');
tic
B1 = im2col(A,[nrows ncols],'distinct');
toc,clear B1

disp('----------------- With CUSTOM-BUILT IM2COL');
tic
B2 = im2col_distinct(A,[nrows ncols]);
toc,clear B2

<强>结果

------------------------- With IM2COL
Elapsed time is 0.026914 seconds.
----------------- With CUSTOM-BUILT IM2COL
Elapsed time is 0.004186 seconds.