【发布时间】:2017-05-13 07:14:04
【问题描述】:
首先,我通过 matlab 通过 2 种不同的方法使用 opencv MSER:
- 通过matlab 的detectMSERFeatures 函数。这似乎叫 opencv MSER(通过在 detectMSERFeatures 函数中调用 ocvExtractMSER)
- 通过更直接的方法:opencv 3.0 wrapper/matlab bindings found in https://github.com/kyamagu/mexopencv
无论哪种方式,我都可以取回我认为是 opencv MSER::detectRegions 2nd arg, "std::vector> &msers 的翻译的像素列表(又名区域)列表"
结果可以是一个包含多个区域的列表,每个区域都有自己的一组点。但是,这些区域的点并不相互排斥。事实上,对于我的前景通常是圆形斑点的数据,它们通常都是同一个连接组件的一部分。即使斑点甚至没有任何孔也是如此(我可能会理解这些区域是否对应于轮廓并且斑点是否有孔)。
我假设这种多区域对一的区域映射甚至是实体 blob 是由于 opencv 的 MSER,在其本机 C++(?)实现中,做同样的事情,但我承认我还没有验证那个(但我肯定不明白。)
那么,有人知道为什么 MSER 会为单个实体连接组件产生多个重叠区域吗?选择一个有什么意义吗?如果有,怎么选? (现在我只是将它们全部组合起来)
编辑 - 我尝试了一个带有一个 blob 的图像,然后我复制了一个图像,其中左半部分与右半部分相同(每一半都是相同的,每个都有相同的 blob )。 MSER 返回 9 个列表/区域,全部对应于这两个 blob。因此,我将不得不进行连通分量分析,以找出区域的哪些子集属于什么 blob,因此显然没有任何直接的方法可以选择返回区域的特定子集,以提供最佳表示这两个 blob(如果你知道根据我的上一个预编辑问题只有一个 blob,那么这样的事情甚至是明智的)
下面的图片是通过绘制为我的单个 blob 图像返回的所有 4 个区域(点列表)制作的。叠加层的创建者:
obj = cv.MSER('MinArea',20,'MaxArea',3000,'Delta',2.5);
[chains, bboxes] = obj.detectRegions(Region8b)
a=cellfun(@(x) cat(1,x{:}),chains,'UniformOutput',false) % get rid of extra layer of cells that detectRegions seems to give it.
% b=cat(1,a{:}); % all the regions points in a single list. Not used here.
ptsstrs={'rx','wo','cd','k.'};
for k=1:4
plot(a{k}(:,1),a{k}(:,2),ptsstrs{k},'MarkerSize',15);
end
因此,您可以看到它们重叠,但似乎也有一个顺序,我认为每个后续区域/列表都是之前列表的超集。
【问题讨论】:
-
如果您的 blob 有多个灰度级,MSER 可能会返回多个区域,具体取决于它们的分布方式。
-
如果它不区分区域和它们所属的连接组件,那有什么意义呢?也许我有这个错误,因为我没有使用实际的 opencv lib 版本并看到原始 MSER 输出,但如果它像我所看到的那样,它会返回一个区域点列表而没有任何进一步的信息。
-
给定一个带有多个返回区域的 blob,什么是正确的使用或者是一个主观的东西。结果看起来像是它返回了沿途计算的内容(通过水平集或修剪)