matlab - 用于元胞数组输出的类似 Blockproc 的函数

标签 matlab

我喜欢blockproc ,它使处理大(非常大)图像变得容易。然而,据我所知,它仅限于使用与输入大小相同的输出矩阵的函数。

所以我想知道是否有一种方法可以复制/模拟 blockproc 所做的事情,但对于输出元胞数组 的函数。我们可以假设处理函数的输出数组与输入矩阵具有相同的维度,或者它只输出一个元胞元素,在这种情况下,总处理的最终输出将是一个包含 的元胞数组M x N 元素,其中 MN 指定处理的平铺。

我相信我可以使用 cellfun 自己构建它,但我想知道是否有任何其他内置函数或库(也许是第三方?)我可以为此使用,甚至可以完全避免重新发明轮子。

更具体地说,我正在寻找与 blockproc 具有相同优势的东西:

  • 可以逐个图 block 地从磁盘加载大图像,以最大限度地减少处理过程中的内存占用
  • 负责构建最终元胞数组的最终结果串联
  • 具有类似于 blockproc 的界面(例如,# of tiles 等)

最佳答案

除第一点外,以下是满足您标准的解决方案

使用 IM2COL 函数将图像中的不同图像 block 排列成列,然后将您的函数应用于每一列,将结果存储在元胞数组中。

当然这只有在所有 block 都适合内存时才有效,否则您将不得不手动编写代码一次提取一个 block 并以这种方式处理它......

%# read image
img = im2double(imread('tire.tif'));

%# blocks params
sizBlk = [8 8];
numBlk = ceil( size(img) ./ sizBlk );

%# extract blocks
B = im2col(img, sizBlk, 'distinct');
B = reshape(B, [sizBlk size(B,2)]);    %# put blocks on the 3rd dimension
B = squeeze( num2cell(B,[1 2]) );      %# convert to cell array
B = reshape(B, numBlk);                %# reshape as blocks overlayed on image

%# process blocks
myFcn = @(blk) [mean2(blk) std2(blk)]; %# or any other processing function
I = cellfun(myFcn, B, 'UniformOutput',false);

%# in this example, we can show each component separately
subplot(121), imshow( cellfun(@(c)c(1),I) ), title('mean')
subplot(122), imshow( cellfun(@(c)c(2),I) ), title('std')

或者,您仍然可以使用 BLOCKPROC 函数,但是您必须多次调用它,每次都计算一个特征:

%# compute one feature at a time
b1 = blockproc(img, sizBlk, @(b)mean2(b.data), 'PadPartialBlocks',true);
b2 = blockproc(img, sizBlk, @(b)std2(b.data), 'PadPartialBlocks',true);

%# combine into cellarray of features
II = arrayfun(@(varargin)[varargin{:}], b1, b2, 'UniformOutput',false);

%# compare to previous results
isequal(I,II)

关于matlab - 用于元胞数组输出的类似 Blockproc 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7286083/

相关文章:

matlab - 确定 matlab 许可证是基于服务器还是基于用户

matlab - 如何使用matlab计算列中数字的相同值

Matlab:如何在每n行中插入 'NaN'

Matlab R2016a 错误 - 等待用户输入时无法与图形交互

matlab - 来自相同投影矩阵的不同基本矩阵

matlab - 满足特定条件时用 NaN 或 Inf 替换值

matlab - 来自具有最大/最小值的 accumarray 的索引

matlab - 使用内置 matlab 函数对一张图和两个子图进行绘图控制

neural-network - Matlab - 如何保存 matlab 神经网络的 View 配置

matlab - 为什么不是球形图?如何在 Matlab 中绘制 3D 极坐标图?