首先,我通过matlab通过两种不同的方法使用opencv MSER:
无论哪种方法,我都可以得到像素列表(也称为区域),我设想的是opencv::检测区域第二arg,"std::vector< std::vector< Point > &msers“的翻译。
结果可以得到多个区域的列表,每个区域都有自己的点集。然而,各区域的观点并不是相互排斥的。实际上,对于我的数据(前景通常是圆点)来说,它们通常都是同一个连接组件的一部分。即使blob甚至没有任何洞,这也是正确的(如果区域对应于等高线,而blob有洞,我可能会理解)。
我假设这种区域到实心点的多个区域对一的映射是由于opencv的MSER,在其本地的C++(?)实现,做同样的事情,但我承认我还没有验证(但我肯定不明白)。
那么,有谁知道为什么MSER会为单个实体连接的组件产生多个重叠区域呢?选择一个有意义吗?如果有,该如何选择?(现在我只是把它们结合在一起)
编辑--我用一个blob尝试了一个图像,然后我复制了一个图像,其中左半和右边相同(每个一半是相同的,每个是同一个blob)。MSER返回9个列表/区域,所有这些列表/区域都对应于两个blobs。因此,我必须进行连接的组件分析,以确定区域的哪些子集属于什么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因此,您可以看到它们重叠,但似乎也有一个顺序,其中我认为每个后续的区域/列表是它之前的列表的一个超集。

发布于 2018-03-22 16:49:01
MSER检测器递增地通过输入图像的强度范围来检测稳定区域。ThresholdDelta参数决定检测器测试稳定性的增量数。这是Matlab的帮助。找到重叠和子集是合理的。显然,随着算法强度的上升或下降,区域会发生变化。
https://stackoverflow.com/questions/41371615
复制相似问题