11

最大安定極値領域(MSER)は、detectMSERFeaturesを使用してMatlabの画像から検出されます。

Matlabから階層MSERコンポーネントツリーを取得するためのパッチまたは方法はありますか?

このツリーは、Matlabが領域を計算するときにとにかく生成されます。これは、各領域のツリーから最も「安定した」コンポーネントのみを返します。このツリーはすでに存在するため、Matlabライブラリのユーザーコードにこれを公開する方法を探しています。これにより、この部分が非表示になり、最終的な「最大限に安定した」領域のみが提供されます。

Matlabの組み込みコードの変更、パッチ、ハッキングなど、何でも構いません。(OpenCVにはそのようなパッチがあることを認識していますが、他のほとんどの手順はMatlabで記述されているため、OpenCVへの移植を避けようとしています)。

編集:(元の階層MSERペーパーから)

検出されたMSER MSERツリー

Detected MSERs(左)、 MSER Tree(右)

4

1 に答える 1

2

「階層 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
于 2015-03-04T19:51:54.407 に答える