【问题标题】:How to setup my function with blockproc to process the image in parts?如何使用 blockproc 设置我的函数来处理部分图像?
【发布时间】:2015-03-10 19:50:28
【问题描述】:

我有一张图片:

我想将此图像分成 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(image, [rc_new], @block_fun)

函数 BLOCKPROC 在评估用户时遇到错误 提供的函数句柄,FUN。

错误的原因是:

使用单一从结构转换为单一的错误是不可能的。

【问题讨论】:

    标签: image matlab image-processing image-segmentation


    【解决方案1】:

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

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

    【讨论】:

    • 这将给出我刚刚意识到的下标分配维度不匹配。
    • @Maurits - 是的,它肯定会。我才意识到输出是什么。在我纠正自己之前,我会等待 OP 回复。
    • 谢谢,更正确实使函数运行,但我现在得到一个维度不匹配。但是,即使我通过使用 rootSIFT 而不是 3 列大小为 128 来强制它保持在 128 大小的向量内,我也会得到第四列全为零。我认为c_new = floor(c/3); %round it 导致了它,并且圆角区域也充当了一个块。有什么办法吗?
    • @FarazKhan - 不抱歉。 blockproc 处理不同的块。如果您尝试将图像分解成不能被您想要的块总数整除的块,您将得到零填充。我没有任何建议让您最终完成这项工作。
    • @FarazKhan - 纠正自己,因为你可以,我错了。包括指向您最新帖子的链接作为对我自己的更正:stackoverflow.com/questions/29040688/… - 我们可以使用blockproc 来处理滑动窗口社区。您只需指定正确的输入参数。
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢,是的,我确实得到了维度不匹配。使用 `im2col` 和 reshape 不会改变我的描述符结构并破坏 SIFT 功能吗?
    猜你喜欢
    • 2015-02-19
    • 1970-01-01
    • 2020-12-09
    • 2021-09-29
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    相关资源
    最近更新 更多