欧几里德距离分割后的图片(只是绝对的,不是绝对的平方) 原始纹理图片
当我使用Kmeans算法和Laws Texture Energy过滤器(群集质心/群组= 6)执行群集时,我得到上面的结果(图1)
改善结果的可能方法有哪些?从结果可以看出,纹理没有明确的界限。 是否可以以某种方式实施扩张/侵蚀?如果是,请指导。
答案 0 :(得分:5)
使用k-means分析纹理会导致您忽略相邻像素之间的空间关系:如果i
和j
彼此相邻,则很可能它们共享相同的texutre。
引入此类空间信息的一种方法是使用可以使用graph cuts或belief-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中提供了一个简单的二进制区域打开过滤器。