1

可能重复:
检测模糊图像中的细线

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

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

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

在此处输入图像描述

4

3 回答 3

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逐个增加,您可以执行类似于二进制搜索的操作。

下面是hm,oresult带有h = 30and的图像l = 15l在 [13, 19] 中同样适用)。这种方法为参数选择提供了灵活性,使其更容易选择/找到好的值。

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

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

于 2012-12-12T15:30:11.450 回答
0

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

于 2012-12-12T16:03:44.803 回答
0

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

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

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

于 2012-12-12T14:11:11.573 回答