Подтвердить что ты не робот

Как получить иерархическое дерево компонентов MSER в Matlab?

Максимально стабильные экстремальные регионы (MSER) ​​найдены из изображения в Matlab, используя detectMSERFeatures.

Есть ли какой-либо патч или метод для получения иерархического дерева компонентов MSER из Matlab?

Это дерево всегда генерируется, когда Matlab вычисляет регионы - он возвращает только самый "стабильный" компонент из каждого дерева области. Поскольку это дерево уже присутствует, я ищу способы предоставить это код пользователя из библиотек Matlab, который скрывает эту часть и предоставляет только конечные "максимально стабильные" регионы.

Все было бы приемлемо - модификации встроенного кода Matlab, исправлений, хаков. (Я понимаю, что OpenCV имеет такой патч, однако я стараюсь избегать переноса на OpenCV, поскольку большинство других процедур написаны в Matlab).

EDIT: (из оригинальной иерархической бумаги MSER)

detected MSERsMSER tree

Detected MSERs (слева), MSER Tree (справа)

4b9b3361

Ответ 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