Ответ 1
"Иерархическое дерево компонентов 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