如何检测模式的边界

时间:2012-12-11 14:38:52

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

  

可能重复:
  Detecting thin lines in blurry image

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

  1. 关闭条纹线
  2. 一条厚L形线
  3. 1&之间的区域2
  4. 我试图将这三个分开,比如3个单独的图像。根据答案的去向,我会根据需要上传更多图片。想法或代码都会有所帮助。

    enter image description here

3 个答案:

答案 0 :(得分:2)

您可以使用形态学来解决(对于某些“解决”值)这个问题。首先,为了使图像更均匀,删除不相关的最小值。一种方法是使用h-dome变换用于区域最小值,其抑制高度的最小值<1。 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 = 15({13,19]中的l同样有效好在这里)。这种方法为参数选择提供了灵活性,使得更容易选择/找到好的值。

enter image description here enter image description here enter image description here

要计算两个最大组件之间的空间区域,我们可以将它们合并,只需计算新连接组件内的黑色像素。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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