我正在尝试使用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
还有一个可选的method
arg,可以设置为"边缘",以使用基于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
强制转换为双数组。