我有以下问题。我必须在非常高维的图像(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.
我有办法这样做吗?
答案 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}];