我对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函数可以执行此操作;但是,到目前为止,我对我的申请并不完全有信心。欢迎任何指示!
答案 0 :(得分:2)
这可以通过3行代码轻松完成。
首先使用im2col
将每个20 x 20的不同块邻域重新整形为一列。因此,此输出将是400 x N
矩阵,其中每列表示已重新整形为列的唯一块邻域。每列将有400行,因为每个邻域有400个元素(20 x 20
)。 N
将是我们40 x 100
图片中的唯一区块总数。这将达到10,因为我们可以根据20 x 20
要求水平放置2个块,垂直放置5个块。
im2col
的输出有什么好处,im2col
的i th 行告诉你 i th 元素,用于图片中的每个块。因此,您接下来要做的就是获取每一行,对所有列进行平均。输出将是400 x 1
向量,表示所有块的平均FFT。这可以使用mean
并指定我们想要对第二维(第二个参数为2
)进行平均来实现,这是列。
然后,我们需要将其重新整形为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
块的列从左到右堆叠在一起。因此,通过执行mean
和reshape
,每个块的空间位置确实相互对应,从而产生正确的答案。
不用多说,这是代码:
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.