0

我有以下问题。我必须在非常高维的图像(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.

我有办法做到这一点吗?

4

1 回答 1

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它们)。

如果您确实决定要“所有列作为巨型矩阵”的列表,那么您可以这样做

giantMatrix = [dsift{:}];

这将返回一个包含(在您的示例中)128 行的矩阵,列数与找到的“兴趣点”一样多。这是简写

giantMatrix = [dsift{1,1} dsift{2,1} dsift{3,1} ... dsift{N,M}];
于 2013-06-25T18:30:11.023 回答