我在第一张图片中显示的区域中有一些纹理。我想根据这个纹理分割图像。为此,我提取了如蓝色方块所示的特征(第二张图像)。我想提取绑定到特征的矩形分布的区域(用红色虚线表示)。
图片1:
图片2:
有人可以通过建议一些方法来解决这个问题。感谢
答案 0 :(得分:1)
这看起来可能适合GraphCut图像分割框架:
你想找到每像素的二进制赋值(1 - 这个像素属于前景,0 - 像素是背景的一部分)。此分配应在前景中包含尽可能多的“纹理位置”,同时保留前景和背景之间的“平滑边界”
平滑度要求会阻止您的“理想”分配为蓝色点为1,其他地方为零。
现在,如何使用Matlab搜索这样的二进制赋值?
假设您img
的大小为H
- by - W
,您已检测到纹理要素的位置,并将这些位置存储在2乘n
矩阵中locs
。
设置每元素成本:
>> bgCost = zeros( H, W );
>> bgCost( [1 H] * (locs-1) + 1 ) = 1000; %// put 1000 penalty for assigning texture dot to foreground
>> fgCost = 10*ones( H, W ); %// assign some positive penalty for assigning non-texture location to FG - prevent an "all foreground" solution.
>> fgCost( [1 H] * (locs-1) + 1 ) = 0;
优化:
>> lambda = 5; %// set relative weight between smoothness term and "texture" term
>> gch = GraphCut('open', cat(3, fgCost,bgCost), lambda * [0 1;1 0],
>> [gch BW] = GraphCut('expand', gch ); %//optimization
>> gch = GraphCut('close', gch ); %//cleanup
你应该在BW
>> figure;imshow( BW, [] );title('binary mask');
如果您对结果BW
不满意,可以使用三个参数:
lambda
的相对强度。 尝试并更改这些值,看看它们如何影响结果蒙版。
我使用this matlab wrapper进行GraphCut优化。