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