如何在Matlab中获得MSER的层次结构组件树?

如何在Matlab中获得MSER的层次结构组件树?,matlab,image-processing,computer-vision,matlab-cvst,Matlab,Image Processing,Computer Vision,Matlab Cvst,在Matlab环境下,利用该算法从图像中找到最大稳定的极值区域(mser) 是否有任何补丁或方法可以从Matlab中获取分层MSER组件树 这棵树是在Matlab计算区域时生成的——它只返回每个区域树中最“稳定”的部分。由于这棵树已经存在,我正在寻找将其公开给Matlab库中的用户代码的方法,这样可以隐藏这部分内容,并且只提供最终的“最大稳定”区域 任何事情都是可以接受的——修改Matlab内置代码、补丁、黑客等等。(我意识到OpenCV有这样一个补丁,但是我试图避免移植到OpenCV,因为大多

在Matlab环境下,利用该算法从图像中找到最大稳定的极值区域(mser)

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

这棵树是在Matlab计算区域时生成的——它只返回每个区域树中最“稳定”的部分。由于这棵树已经存在,我正在寻找将其公开给Matlab库中的用户代码的方法,这样可以隐藏这部分内容,并且只提供最终的“最大稳定”区域

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

编辑:(来自原件)

检测到的MSER
(左),
MSER树
(右)

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


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

% 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

您可以尝试使用OpenCV Mex函数,只需从Matlab内部调用OpenCV函数。OpenCV for Matab的几个Mex实现是可用的。但是,默认OpenCV MSER函数的修补程序不太可能有Mex。在这种情况下,您可以尝试自己编译一个。您还可以尝试在…中查看的实现,您可以尝试查看Matlab代码
detectMSERFeatures.m
。此外,您可以检查Matlab是否使用了大量OpenCV代码,因此Matlab可能无法访问OpenCV
DetectMerfeatures中的中间信息。m
只是调用mex函数
ocvExtractMSER
,这意味着仅使用Matlab代码无法实现这一点。我同意@RiddhimanDasgupta的观点,即寻找(或自己编译)原始OpenCV函数的Mex版本并公开输出是一个很好的方法。查看此链接,有人制作了一个补丁。