活动轮廓蛇



我正在尝试使用MATLAB activecontour代码来分割区域。这个例子使用的是灰度图像,而我使用的是二进制图像。当我通过调用二进制映像来运行代码时,结果是可以的。然而,当我组合代码时,什么也没发生。它跳过迭代部分,生成sama二进制图像。下面是我的代码,供您参考。

%% snake 
figure
x = imread('1.jpg');
threshold = 160;
I = rgb2gray(x);
I = Igray>threshold;
imshow (I);
I = imresize(I,.5); 
imshow(I)
title('Original Image')
mask = zeros(size(I));
mask(25:end-25,25:end-25) = 1;
imshow(mask)
title('Initial Contour Location')
bw = activecontour(I,mask,1300);
imshow(bw)
title('Segmented Image, 300 Iterations')

从snake的代码开始不会发生任何进程。它最终只生成二进制图像。我希望有人能试着运行这个,并帮助我找到我的错误。提前感谢

Matlab的activecontour函数默认使用Chan–Vese(无边活动轮廓(方法,如Cris所说。实现";使用类似于[3]"中描述的方法的稀疏字段水平集方法;,引用Whitaker;一种从范围数据进行三维重建的水平集方法";。(除了Chan–Vese之外,activecontour还有一个可选的methodarg,可以设置为"边缘",以使用基于Caselles、Kimmel和Sapiro的(旧的(测地线主动等值线方法的替代"基于边缘的模型"。(

Chan–Vese方法通过寻找等于"0"的二值图像来分割灰度图像;c1";在轮廓内;c2";在轮廓外,既有平滑的轮廓,又是原始图像的良好近似。该方法优化c1、c2和轮廓的形状,从一些初始轮廓开始,并通过迭代过程对其进行演化。

如果你愿意原谅自我引用,你可以在IPOL杂志上找到一篇关于Chan–Vese的文章、开源C代码和在线演示http://www.ipol.im/pub/art/2012/g-cv/,您可能会觉得这很有帮助。

那么,为什么它在你的情况下不起作用呢?一些想法:

  • 在您的使用中,由于输入图像已经是二进制图像,因此该方法很容易简单地将c1=0,c2=1和轮廓设置为输入的边缘,因此";什么都没发生";。尝试设置可选的"SmoothFactor"参数(可能为较大值(,以强制该方法寻找更平滑的轮廓。

  • 这可能是一个数据类型问题,因为映像I作为逻辑数组传递给activecontour,但通常函数采用数字数组。在传递之前,请尝试将I强制转换为双数组。

相关内容

  • 没有找到相关文章

最新更新