有没有办法控制blockproc输出的串联?

时间:2015-03-17 20:40:34

标签: image matlab image-processing image-segmentation dct

这是问题的后续跟进:Overlapping sliding window over an image using blockproc or im2col?

所以使用代码:

B = blockproc(A, [1 1], @block_fun, 'BorderSize', [2 2], 'TrimBorder', false, 'PadPartialBlocks', true)

我能够在我的图像上创建一个重叠的滑动窗口,并为每个窗口计算dct2。但问题是blockproc以我无法使用的方式连接输出。输出很大程度上取决于块大小,输出矩阵的大小每次都不同。

我的dct2函数为每个块或窗口创建一个1 x 200向量。所以我假设如果有64个块,我应该得到类似64 x 200200 x 64输出的东西,但是我得到类似64 x 1600的东西,或者如果是更大的块我得到15 x 400

查看blockproc函数问题是由

引起的
% write 4 corner blocks
b(1:ul_output_size(1),1:ul_output_size(2),:) = ul_output;
if ll_processed
    last_row_start = final_rows - size(ll_output,1) + 1;
    last_row_width = size(ll_output,2);
    b(last_row_start:end,1:last_row_width,:) = ll_output;
end
if ur_processed
    last_col_start = final_cols - size(ur_output,2) + 1;
    last_col_height = size(ur_output,1);
    b(1:last_col_height,last_col_start:end,:) = ur_output;
end
if lr_processed
    last_row_start = final_rows - size(ll_output,1) + 1;
    last_col_start = final_cols - size(ur_output,2) + 1;
    b(last_row_start:end,last_col_start:end,:) = lr_output;
end

显然,blockproc进一步将块分为左上角,右上角,左下角和右下角,并将结果连接起来。这就是为什么我得到所有这些混合输出。

对于每个窗口,我需要每行中每个块的输出。每个窗口都应该只给我一个1x200输出,我可以输入分类器。

我可以按照我想要的方式强制blockproc的输出,只需给出每个块的输出。

如果没有,我真的很感激在图像上有一个重叠的滑动窗口的替代解决方案。

编辑是否可以将每个块的block_struct.data块数据保存到函数block_fun内的单元格数组中,然后使用该数组提取我的特征

谢谢

修改

B = blockproc(images_m{1}, [64 64], @(x)reshape(x.data(:),[1 1 numel(x.data)]), 'BorderSize', [10 10], 'TrimBorder', false, 'PadPartialBlocks', true, 'PadMethod', 'replicate');
imgs = {};
for i = 1:size(B,1)
    for j = 1:size(B,2)
        tempy = squeeze(B(i,j,:));
        tempy2 = reshape(tempy, [84 84]);
        feats{end+1} = block_dct2(tempy2); %calculates dct2 for the block and returns a 1*200 vector

    end
end

2 个答案:

答案 0 :(得分:1)

也许在第三维中重塑数据?

>> A = magic(3)

A =

     8     1     6
     3     5     7
     4     9     2

>> B = blockproc(A, [1 1], @(x)reshape(x.data(:),[1 1 numel(x.data)]), 'BorderSize', [1 1], 'TrimBorder', false, 'PadPartialBlocks', true);

>> whos B
  Name      Size             Bytes  Class     Attributes

  B         3x3x9              648  double  
>> squeeze(B(1,1,:))

ans =

     0
     0
     0
     0
     8
     3
     0
     1
     5

>> 

答案 1 :(得分:1)

使用MAT2CELL的替代方案:

function extractFeatures
images_m{1} = rand(128);
B = blockproc(images_m{1}, [64 64], @processBlock,...
    'BorderSize', [10 10], 'TrimBorder', false,...
    'PadPartialBlocks', true, 'PadMethod', 'replicate');

%B is 2x400 i.e 2x2 blocks of each block being a 1x200 feature vector
m = ones(1,size(B,1));
n = 200*ones(1,size(B,2)/200);
% The MAT2CELL help does a good job, just read it carefully and run the
% examples
feats = mat2cell(B,m,n);
feats = feats(:);

end

function feature = processBlock(bstruct)    
    % I dont know what block_dct2 does:
    %feature = block_dct2(bstruct.data);
    % So I'll put in a place holder which returns a 1x200 'feature'
    % for each overlapping image block
    feature = repmat(mean(bstruct.data(:)), [1 200]);
end