【问题标题】:How to obtain Hierarchical component tree of MSER in Matlab?Matlab中如何获取MSER的分层组件树?
【发布时间】:2013-01-11 09:41:50
【问题描述】:

使用 detectMSERFeatures 从 Matlab 中的图像中找到最大稳定极值区域 (MSER)。

是否有任何补丁或方法可以从 Matlab 中获取 分层 MSER 组件树

这棵树无论如何都是在 Matlab 计算区域时生成的——它只返回每个区域树中最“稳定”的组件。由于这棵树已经存在,我正在寻找将其公开给来自 Matlab 库的用户代码的方法,这使这部分保持隐藏并仅提供最终的“最大稳定”区域。

任何东西都是可以接受的——修改 Matlab 内置代码、补丁、hack 等等。 (我意识到 OpenCV 有这样的补丁,但是我试图避免移植到 OpenCV,因为大多数其他程序都是用 Matlab 编写的)。

编辑:(来自原hierarchical MSER paper

Detected MSERs(左),MSER Tree(右)

【问题讨论】:

  • 您可以尝试使用 OpenCV Mex 函数并简单地从 Matlab 内部调用 OpenCV 函数。有几个用于 Matab 的 OpenCV 的 Mex 实现可用。但是,默认 OpenCV MSER 函数的补丁不太可能具有 Mex。在这种情况下,您可以尝试自己编译。
  • 您也可以尝试在VLFeat toolbox 中查看vl_mser 的实现...
  • 您可以尝试查看 Matlab 代码 detectMSERFeatures.m。此外,您可以检查 Matlab 是否使用了大量 OpenCV 代码,因此可能 Matlab 无法访问 OpenCV 的中间信息
  • detectMSERFeatures.m 只是调用了 mex 函数 ocvExtractMSER,这意味着您无法仅使用 MATLAB 代码来执行此操作。我同意@RiddhimanDasgupta 的观点,即寻找(或自己编译)原始 OpenCV 函数的 Mex 版本以及您想要公开的输出是一个好方法。
  • 看看这个链接,有人做了补丁。 code.ros.org/trac/opencv/ticket/1577

标签: matlab image-processing computer-vision matlab-cvst


【解决方案1】:

“分层 MSER 组件树”是一个令人困惑的短语,因为 (1) 组件树已经是分层的 (2) 如果您想要整个树,那么您不只想要最大稳定极值区域 (MSER),但是你想要所有的极值区域,并且 (3) 极值区域和组件在这种情况下是相同的。

假设您想要极值区域树。如 cmets 所述,您不能完全拥有 MATLAB 使用的那个,因为 detectMSERFeatures.m 调用了一个我们没有源代码的 mex 函数(不过,根据它的输入和名称,它可能与 openCV 非常相似MSER 函数)。但是您仍然可以计算自己的极值区域树。基本上,这段代码所做的是在图像中以不同的阈值级别找到连接的组件。这些CC是极值区域。代码中最棘手的部分是记录父关系。这应该可以帮助您开始:

% input image, included with MATLAB
x = imread('rice.png');

pixelList = {};
parents = [];
oldERsLabeled = zeros(size(x));
oldPixelList = {};
regionLabelOffset = 0;
for i = 255:-10:1 % the stride here is important, smaller will be slower and give more regions
    newERs = bwlabel(x > i);
    newERsLabeled = zeros(size(newERs));

    newERsLabeled(newERs > 0) = newERs(newERs > 0) + regionLabelOffset;
    regionLabelOffset = max(newERsLabeled(:));

    % update the list of regions
    props = regionprops(newERs, 'pixelList');
    newPixelList = {props(:).PixelList};
    pixelList = [pixelList newPixelList];

    % figure out parents
    newParents = cellfun(@(c)(newERsLabeled( sub2ind(size(x), c(1,2), c(1,1)))), oldPixelList);
    parents = [parents; newParents'];

    oldPixelList = newPixelList;
    oldERsLabeled = newERsLabeled;
end
parents(end+1 : length(pixelList)) = -1; % top level regions have no parents

pixelListInt = cellfun(@int32, pixelList, 'UniformOutput', false);
regions = MSERRegions(pixelListInt');

% plot the first 300 regions
figure
imshow(x)
hold on
plot(regions(1:300), 'showEllipses', false, 'showPixelList', true);

% show all parents of a region ("close all" command might be useful after)
curRegion = 102;
while curRegion ~= -1
    figure
    imshow(x)
    hold on
    plot(regions(curRegion), 'showEllipses', false, 'showPixelList', true);
    curRegion = parents(curRegion);
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 2015-06-10
    • 2013-08-22
    • 1970-01-01
    相关资源
    最近更新 更多