在Matlab上改进纹理分割结果

时间:2013-10-28 12:09:02

标签: matlab image-processing textures image-segmentation mathematical-morphology

enter image description here 欧几里德距离分割后的图片(只是绝对的,不是绝对的平方)enter image description here 原始纹理图片

当我使用Kmeans算法和Laws Texture Energy过滤器(群集质心/群组= 6)执行群集时,我得到上面的结果(图1)

改善结果的可能方法有哪些?从结果可以看出,纹理没有明确的界限。 是否可以以某种方式实施扩张/侵蚀?如果是,请指导。

2 个答案:

答案 0 :(得分:5)

使用k-means分析纹理会导致您忽略相邻像素之间的空间关系:如果ij彼此相邻,则很可能它们共享相同的texutre。
引入此类空间信息的一种方法是使用可以使用graph cutsbelief-propagation(以及其他内容)优化的成对能量。

假设图片中有n像素,而k-means中有L个质心,那么 D是一个L - by - n矩阵,D(i,l)是像素i到中心l的距离。

如果您选择使用图表剪切,可以下载my wrapper(不要忘记编译它),然后在Matlab中:

>> sz = size( img ); % n should be numel(img)
>> [ii jj] = sparse_adj_matrix( sz, 1, 1 ); % define 4-connect neighbor grid
>> grid = sparse( ii, jj, 1, n, n );
>> gch = GraphCut('open', D, ones( L ) - eye(L), grid );
>> [gch ll] = GraphCut('expand', gch );
>> gch = GraphCut('close', gch );
>> ll = reshape( double(ll)+1, sz );
>> figure; imagesc(ll);colormap (rand(L,3) ); title('resulting clusters'); axis image;

您可以找到sparse_adj_matrix here


对于许多优化算法的最新实现,请查看opengm包。

答案 1 :(得分:0)

关于形态学过滤我建议使用这个参考:Texture Segmentation Using Area Morphology Local Granulometries。本文基本上描述了一个morphological area opening filter,它删除了小于给定区域参数阈值的灰度分量。在二进制图像中,可以通过在每个图像像素位置处放置窗口来生成局部粒度大小分布,并且在每次打开操作之后,计算其中的剩余像素的数量。这导致局部大小分布,可以归一化以给出本地pdf。区分模式光谱给出了在像素处产生局部模式光谱的密度,提供了包含每个像素位置本地的纹理信息的概率密度。

Here是使用图像粒度的示例。它们基本上是非线性比例空间,它们在灰度分量的区域上工作。基本直觉是每个纹理可以基于它们的灰度分量的区域的光谱来表征。 Matlab中提供了一个简单的二进制区域打开过滤器。