如何使用 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 将应用于大小为 r
和 c_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 不允许的。
我认为使用 im2col
和 reshape
会简单得多。
对于您的自定义函数,blockproc
发送一个结构,其中图像数据存储在名为 data
的 字段 中。因此,您只需更改您的函数,使其访问输入中的数据字段。像这样:
function feats = block_fun(block_struct) %// Change
[keypoints, descriptors] = vl_sift(single(block_struct.data)); %// Change
feats = descriptors;
end
我有一张图片:
我想把这个图像分成 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(图像, [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 不允许的。
我认为使用 im2col
和 reshape
会简单得多。
对于您的自定义函数,blockproc
发送一个结构,其中图像数据存储在名为 data
的 字段 中。因此,您只需更改您的函数,使其访问输入中的数据字段。像这样:
function feats = block_fun(block_struct) %// Change
[keypoints, descriptors] = vl_sift(single(block_struct.data)); %// Change
feats = descriptors;
end