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

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

无论如何,当Matlab计算区域时都会生成此树-它仅返回每个区域树中最“稳定”的组件。由于该树已经存在,因此我正在从Matlab库中寻找向用户代码公开此树的方法,该方法使这部分保持隐藏状态,并仅提供最终的“最大稳定”区域。

一切都可以接受-修改Matlab内置代码,补丁程序,修改内容。 (我意识到OpenCV有这样的补丁,但是我试图避免移植到OpenCV,因为大多数其他过程都是用Matlab编写的)。

编辑:(来自原始hierarchical MSER paper)


Detected MSERs(左),MSER Tree(右)

最佳答案

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

假设您要使用极值区域树。如注释中所述,您可能无法完全使用一个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

关于matlab - 如何在Matlab中获得MSER的层次结构树?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14555471/

10-10 05:22