可能重复:
检测模糊图像中的细线
所以正如标题所说,我正在尝试检测模式的边界。在所附图片中,您基本上可以看到三种不同的图案。
- 关闭条纹线
- 一根粗L形线
- 1和2之间的区域
我试图将这三个分开,比如 3 个单独的图像。取决于答案的去向,如果需要,我会上传更多图片。想法或代码都会有所帮助。
可能重复:
检测模糊图像中的细线
所以正如标题所说,我正在尝试检测模式的边界。在所附图片中,您基本上可以看到三种不同的图案。
我试图将这三个分开,比如 3 个单独的图像。取决于答案的去向,如果需要,我会上传更多图片。想法或代码都会有所帮助。
您可以使用形态学解决(对于“解决”的某些值)这个问题。首先,为了使图像更均匀,去除不相关的最小值。一种方法是使用区域最小值的 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');
现在,您需要确定h
和l
。该参数h
预计会更容易,因为它与输入的比例无关,在您的示例中,[10, 30] 范围内的值可以正常工作。确定l
粒度分析可能会有所帮助。另一种方法是检查是否result
包含两个重要的连通分量,对应于较大的 L 形状和细线区域。无需l
逐个增加,您可以执行类似于二进制搜索的操作。
下面是hm
,o
和result
带有h = 30
and的图像l = 15
(l
在 [13, 19] 中同样适用)。这种方法为参数选择提供了灵活性,使其更容易选择/找到好的值。
为了计算两个最大组件之间的空间面积,我们可以合并它们并简单地计算新连接组件内的黑色像素。
只是抛出想法。您可以对图像进行二值化并进行连接组件标记。然后对连接的组件(例如宽度)进行一些分析以区分区域。
您可以传递一个窗口(10x10 像素?)并收集该窗口的特征。这些特征可以像该窗口内的累积梯度(边缘)一样简单。只要窗口足够大,这将区分各个区域。
然后使用每个窗口作为数据点,你可以做一些聚类,或者如果模式变化不大,你可以做一些简单的阈值来确定哪些数据点属于哪些模式(较大的梯度和属于小线:更多的边缘,而最小的梯度和属于最粗的线:只有一个边缘,而介于两者之间的那些属于另一个“中间”模式。
获得此分类后,您可以根据需要创建单独的图像。