matlab中的Blockproc有两个输出变量

时间:2013-06-25 18:23:48

标签: image-processing matlab

我有以下问题。我必须在非常高维的图像(182MP)中计算密集的SIFT兴趣点。当我在完整图像中运行代码时,Matlab总是突然关闭。所以我决定在图像补丁中运行代码。

代码

我尝试在matlab中使用blocproc来调用以这种方式执行密集的筛选兴趣点检测的c ++函数:

fun = @(block_struct) denseSIFT(block_struct.data, options);
[dsift , infodsift] = blockproc(ndvi,[1000 1000],fun);

其中dsift是筛选描述符(向量),infodsift具有兴趣点的信息,例如x和y坐标。

问题

问题在于blocproc只允许一个输出,但我想要两个输出。运行代码时,matlab给出了以下错误。

Error using blockproc
Too many output arguments.

我有办法这样做吗?

1 个答案:

答案 0 :(得分:1)

对于blockproc版本的“硬编码”会不会有问题?

假设您可以将图像划分为NxM较小的图像,您可以按如下方式循环:

bigImage = someFunction();
sz = size(bigImage);
smallSize = sz ./ [N M];
dsift = cell(N,M);
infodsift = cell(N,M);
for ii = 1:N
  for jj = 1:M
    smallImage = bigImage((ii-1)*smallSize(1) + (1:smallSize(1)), (jj-1)*smallSize(2) + (1:smallSize(2));
    [dsift{ii,jj} infodsift{ii,jj}] = denseSIFT(smallImage, options);
  end
end

结果将在两个单元阵列中。没有真正需要预先分配,但如果你这样做,它会更整洁。如果单个矩阵的大小相同,则可以使用

转换为单个大矩阵
dsiftFull = cell2mat(dsift);

几乎是魔法。如果你的矩阵大小不同,这将不起作用 - 但是,如果它们是,我不确定你是否愿意将它们全部放在一个(除非你决定horzcat它们)。 / p>

如果你确定你想要一个“所有colums作为一个巨大的矩阵”的列表,那么你可以做

giantMatrix = [dsift{:}];

这将返回一个矩阵(在您的示例中)有128行,并且找到的列数与找到的“兴趣点数”相同。这是

的简写
giantMatrix = [dsift{1,1} dsift{2,1} dsift{3,1} ... dsift{N,M}];