如何使用Graph Cuts分割灰度2D图像中的对象?

时间:2015-01-05 21:08:51

标签: matlab image-processing image-segmentation

我需要使用@rayryeng在Matlab Wrapper for Graph Cuts中建议的Shai Bagon的this post从胸部X光图像中提取出一些不需要的物体。

我已经通过Boykov阅读了这篇论文,并了解了Graph Cuts的工作原理。我还下载了Shai Bagon的Matlab Warpper for Graph Cuts并编译了所需的mex文件。为了开始,我下载了简单的example图像分割。但是,我对如何使用

感到困惑
[gch ...] = GraphCut(mode, ...);

用于分割灰度2D图像中不需要的对象。

任何帮助都会一如既往地受到赞赏。感谢。

1 个答案:

答案 0 :(得分:4)

非常基础:

img = imread('http:%//i.stack.imgur.com/nntda.png'); %// read the image
img = img(:,:,1); %// use only one channel as it is a gray scale image

观察到物体大多比110亮,而其余肺部比这个值更暗,你可以定义每像素数据项:

Dc(:,:,1) = img > 110; %// cost of 1-st label (bg): penalize pixels brighter than 110
Dc(:,:,2) = img < 110; %// cost of 2-nd label (fg): penalize pixels darker than 110    
lambda = 11; %// relative weight of smoothness cost vs. data cost
Sc = [0 1; 1 0]; %// give 0 cost for bg-bg or fg-fg transitions, and 1 cost for fg-bg transitions

使用GraphCut包装器执行优化:

gch = GraphCut( 'open', Dc, lambda * Sc ); %// define the graph
[gch L] = GraphCut('expand', gch ); %//optimize and get the labeling L
gch=GraphCut('close',gch); %// clean up the mess

接下来你能做什么? (除了赞成并接受这个非凡的答案)

  1. 使用更复杂的数据成本 - 使用L1或L2&#34;距离&#34;从110级门槛。
  2. 使用&#34;更顺畅的&#34;平滑成本 - 使平滑成本取决于图像边缘。
  3. 使用8连接的网格图而不是默认的4连接 - 这将减少分段边界的&#34;阶梯形状。
  4. 使用更好的前景/背景模型 - 根据图像补丁而不是单个像素制作外观模型。
  5. 我会留给你找出改进这种方法的更多令人兴奋的方法......