【问题标题】:How to detect boundaries of a pattern [duplicate]如何检测模式的边界[重复]
【发布时间】:2012-11-29 02:37:44
【问题描述】:

可能重复:
Detecting thin lines in blurry image

正如标题所说,我正在尝试检测模式的边界。在所附图片中,您基本上可以看到三种不同的图案。

  1. 关闭条纹线
  2. 一条粗 L 形线
  3. 1 和 2 之间的区域

我试图将这三个分开,比如 3 个单独的图像。取决于答案的去向,如果需要,我会上传更多图片。想法或代码都会有所帮助。

【问题讨论】:

  • 您希望检测的模式只有这些吗?或者他们会改变吗?另外,您的编程语言/平台是什么?可用的库会因您的回答而异。
  • 模式没有改变。那是条纹线,无论是垂直的还是水平的。关于图书馆和语言,任何事情都可以,因为我主要是在寻找一个想法。谢谢。
  • @Astor:这个话题和另一个话题没有关系。在这里,我没有检测线条或提取。目的是检测区域/段。例如,使用其他主题的建议方法对于检测该图像中的 3 个区域将无用。我说的对吗?
  • 人们拒绝他们不理解的东西,这显然不是重复,更不用说完全重复。 Stackoverflow 处于悲伤状态。

标签: image image-processing pattern-matching feature-detection edge-detection


【解决方案1】:

您可以传递一个窗口(10x10 像素?)并收集该窗口的特征。这些功能可以像该窗口内的累积 gradients (edges) 一样简单。只要窗口足够大,这将区分各个区域。

然后使用每个窗口作为数据点,您可以进行一些聚类,或者如果模式变化不大,您可以做一些简单的阈值来确定哪些数据点属于哪些模式(较大的梯度和属于小线:更多的边缘,而最小的梯度和属于最粗的线:只有一个边缘,而中间的那些属于另一个“中间”模式。

获得此分类后,您可以根据需要创建单独的图像。

【讨论】:

  • 感谢 Noremac。最初我虽然关于类似的方法。但我注意到,即使图案/纹理非常恒定,但条纹线之间的差距却明显不同。在某些图像中,10x10 的窗口将包含 3-4 行,但在另一幅图像中,它甚至不会包含一条线,因为间隙之间的空间将是两倍大。这种变化也适用于其他部分。我是否正确理解了您的建议?谢谢。
  • 听起来你大部分时间都是这样做的。如果有一个可靠的上限(最大区域的宽度),那么您至少可以在所有这些上获得优势。如果我正确理解您的担忧,实际上会有四个类别(大、中、小、无)。条纹线之间的不同间隙将区分不同的区域。如果没有合理的上限,那么这可能不是一个好方法。
【解决方案2】:

您可以使用形态学解决(对于“解决”的某些值)这个问题。首先,为了使图像更均匀,去除不相关的最小值。一种方法是使用区域最小值的 h-dome 变换来抑制高度 h 的最小值。现在,我们要加入细线。这是通过具有长度为l 的水平线的形态开口来实现的。如果线条被合并,那么当前图像的区域最小值就是背景。所以我们可以通过填充孔来获得相关的组件。以下代码总结了这些任务:

f = rgb2gray(imread('http://i.stack.imgur.com/02X9Z.jpg'));
hm = imhmin(f, h);
o = imopen(hm, strel('line', l, 0));
result = imfill(~imregionalmin(o), 'holes');

现在,您需要确定hl。参数h 预计会更容易,因为它与输入的比例无关,在您的示例中,[10, 30] 范围内的值工作正常。要确定l,粒度分析可能会有所帮助。另一种方法是检查result 是否包含两个重要的连通分量,对应于较大的 L 形和细线区域。无需将l 逐一增加,您可以执行类似于二分查找的操作。

这里是 hmoresult 图像与 h = 30l = 15l 在 [13, 19] 在这里同样适用)。这种方法为参数选择提供了灵活性,从而更容易选择/找到好的值。

要计算两个最大组件之间的空间面积,我们可以合并它们并简单地计算新连接组件内的黑色像素。

【讨论】:

  • 非常感谢您抽出宝贵时间。我的最新方法与你的方法很接近,除了 imhmin 部分。这让我大吃一惊!!!!但是,如果输入图像与 90' 旋转相同,您会怎么做?然后水平线将被强调,你不能得到同样完美的结果。对于这个问题,我不能在这里对输入图像的方向做出任何假设。谢谢。
  • 有一些方法可以估计方向。在您的情况下,有一些简单的方法可以在使用水平线进行形态闭合后考虑音量。例如,这是我用宽度/2 的线得到的:i.imgur.com/GNx8u.pngi.imgur.com/gUUrM.png。为了更好地了解这一点,请考虑阅读 Soille 和 Talbot 的“使用数学形态学的图像结构定位”。
【解决方案3】:

只是抛出想法。您可以对图像进行二值化并进行连接组件标记。然后对连接的组件(例如宽度)进行一些分析以区分区域。

【讨论】:

  • 感谢您的评论。但是使用 BW+Connected 组件会完全破坏我们感兴趣的纹理。另一方面,如您所见,所有提到的区域都是相互连接的。出于同样的原因,分割也不是一个好主意。
猜你喜欢
  • 2011-06-29
  • 2015-07-31
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
相关资源
最近更新 更多