首先,我通过matlab通过2种不同的方法使用opencv MSER:
无论哪种方式,我都可以找回像素列表(也就是区域)的列表,我想这些列表是opencv MSER :: detectRegions 2nd arg的翻译," std :: vector<的std ::矢量<点> > &安培; 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
所以,你可以看到它们重叠,但似乎也有一个顺序,我认为每个后续的区域/列表都是它之前的列表的超集。
答案 0 :(得分:0)
“MSER检测器逐步逐步调整输入图像的强度范围以检测稳定区域.ThresholdDelta参数确定检测器测试稳定性的增量数。”这来自Matlab帮助。找到重叠和子集是合理的。显然,随着算法强度上升或下降,该区域会发生变化。