如何使用 blockproc 设置我的函数来分部分处理图像?

How to setup my function with blockproc to process the image in parts?

我有一张图片:

我想把这个图像分成 3 个相等的部分,分别计算每个部分的 SIFT,然后连接结果。

我发现 Matlab 的 blockproc 就是这样做的,但我不知道如何让它与我的函数一起工作。这是我拥有的:

[r c] = size(image);
            c_new = floor(c/3); %round it 

            B = blockproc(image, [r c_new], @block_fun)

因此根据 Matlabs 文档,函数 block_fun 将应用于大小为 rc_new 的原始图像。

这是我写的block_fun

function feats = block_fun(img)
[keypoints, descriptors] = vl_sift(single(img));
feats = descriptors;
end

所以,我的矩阵 B 应该是同一图像所有三个部分的 SIFT 描述符的串联?对吗?

但是当我 运行 命令时得到的错误:

B = blockproc(图像, [r c_new], @block_fun)

Function BLOCKPROC encountered an error while evaluating the user supplied function handle, FUN.

The cause of the error was:

Error using single Conversion to single from struct is not possible.

此错误是由于 blockproc 通过其句柄调用的函数需要一个块结构。

真正的问题是 blockproc 将尝试连接所有结果,并且每个块都有一组不同的 128xN 特征向量,这是 blockproc 不允许的。

我认为使用 im2colreshape 会简单得多。

对于您的自定义函数,blockproc 发送一个结构,其中图像数据存储在名为 data 字段 中。因此,您只需更改您的函数,使其访问输入中的数据字段。像这样:

function feats = block_fun(block_struct) %// Change
[keypoints, descriptors] = vl_sift(single(block_struct.data)); %// Change
feats = descriptors;
end