用于单元阵列输出的类似Blockproc的函数

时间:2011-09-02 15:56:36

标签: matlab

我喜欢blockproc,它可以轻松处理大型(非常大)的图像。但是,据我所知,它仅限于使用输出与其输入相同大小的矩阵的函数。

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

我相信我可以使用cellfun自己构建这个,但我想知道是否有其他内置或库(可能是第三方?)我可以使用它,甚至可以完全避免重新发明轮。

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

  • 可以逐层逐层地从磁盘加载大图像,以最大限度地减少处理的内存占用
  • 负责构建最终单元阵列的最终结果连接
  • 具有类似于blockproc的界面(例如,瓷砖等)

2 个答案:

答案 0 :(得分:2)

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

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

当然这仅适用于所有块都适合内存的情况,否则你必须手动编写一次提取一个块并以这种方式处理它的代码......

%# 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)

答案 1 :(得分:0)

我一直在做类似的事情,虽然数字值而不是单元格。

这样的事情应该有效:

I = imread('pout.tif'); 

G = blockproc(I, [8 8], @(b) shiftdim(imhist(b.data)', -1), 'PadPartialBlocks', true);

G = reshape(G, size(G, 1) * size(G, 2), size(G, 3));

pout.tif是一个灰度图像,但我确信这可以改为RGB。

使用shiftdim时也要小心,imhist返回一个行向量,所以我把它转换成一列。