有什么方法可以控制 blockproc 输出的串联吗?
Is there any way to control the concatenation of the blockproc output?
这是问题的跟进:
所以通过使用代码:
B = blockproc(A, [1 1], @block_fun, 'BorderSize', [2 2], 'TrimBorder', false, 'PadPartialBlocks', true)
我能够在图像上创建重叠滑动 window 并为每个 window 计算 dct2
。但问题是 blockproc
以我无法使用的方式连接输出。输出很大程度上取决于块大小,输出矩阵的大小因此每次都不同。
我的 dct2
函数为每个块或 window 创建一个 1 x 200
向量。所以我假设如果有 64 个块,我应该得到类似 64 x 200
或 200 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 将块进一步划分为左上、右上、左下和右下,并将结果连接起来。这就是我得到所有这些混合输出的原因。
对于每个 window,我需要每一行中每个块的输出。每个 window 应该只给我一个 1x200
输出,我可以将其输入我的分类器。
我可以按照我想要的方式强制输出blockproc
吗,只要给出每个块的输出即可。
如果没有,我将非常感谢在图像上进行重叠滑动 window 的替代解决方案。
编辑: 是否可以使用 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
也许在三维中重塑您的数据?
>> 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
>>
使用 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
这是问题的跟进:
所以通过使用代码:
B = blockproc(A, [1 1], @block_fun, 'BorderSize', [2 2], 'TrimBorder', false, 'PadPartialBlocks', true)
我能够在图像上创建重叠滑动 window 并为每个 window 计算 dct2
。但问题是 blockproc
以我无法使用的方式连接输出。输出很大程度上取决于块大小,输出矩阵的大小因此每次都不同。
我的 dct2
函数为每个块或 window 创建一个 1 x 200
向量。所以我假设如果有 64 个块,我应该得到类似 64 x 200
或 200 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 将块进一步划分为左上、右上、左下和右下,并将结果连接起来。这就是我得到所有这些混合输出的原因。
对于每个 window,我需要每一行中每个块的输出。每个 window 应该只给我一个 1x200
输出,我可以将其输入我的分类器。
我可以按照我想要的方式强制输出blockproc
吗,只要给出每个块的输出即可。
如果没有,我将非常感谢在图像上进行重叠滑动 window 的替代解决方案。
编辑: 是否可以使用 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
也许在三维中重塑您的数据?
>> 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
>>
使用 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