我有一张图片:
我想将这个图像分成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将以大小为r
和c_new
的块应用于原始图像。
这就是我写的block_fun
function feats = block_fun(img)
[keypoints, descriptors] = vl_sift(single(img));
feats = descriptors;
end
那么,我的矩阵B
应该是同一图像的所有三个部分的SIFT描述符的串联?正确?
但是我运行命令时得到的错误:
B = blockproc(image,[r c_new],@ block_fun)
函数BLOCKPROC在评估用户时遇到错误 提供功能手柄,乐趣。
错误的原因是:
无法使用单个转换为单个struct的错误。
答案 0 :(得分:1)
此错误是由blockproc通过其句柄调用的函数需要块结构的事实引起的。
真正的问题是blockproc将尝试连接所有结果,并且每个块都有一组不同的128xN特征向量,blockproc不允许这样做。
我认为使用im2col
和reshape
会更加简单。
答案 1 :(得分:1)
对于自定义功能,blockproc
会将图像数据存储在名为data
的字段中。因此,您只需更改您的函数,以便它访问输入中的数据字段。像这样:
function feats = block_fun(block_struct) %// Change
[keypoints, descriptors] = vl_sift(single(block_struct.data)); %// Change
feats = descriptors;
end