「階層 MSER コンポーネント ツリー」は紛らわしい言い回しです。(1) コンポーネント ツリーは既に階層的であり、(2) ツリー全体が必要な場合は、Maximally Stable Extremal Regions (MSER) だけではなく、すべての極値領域が必要であり、(3) このコンテキストでは極値領域とコンポーネントは同じものです。
では、極値領域ツリーが必要だとしましょう。コメントに記載されているように、detectMSERFeatures.m
ソース コードがない mex 関数を呼び出すため、MATLAB が使用するものを正確に使用することはできません (ただし、その入力と名前に基づいて、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