活动轮廓蛇

时间:2020-09-26 14:33:02

标签: matlab image-processing computer-vision image-segmentation contour

我正在尝试使用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')

从蛇的代码开始不会发生任何过程。它最终只会生成二进制图像。我希望有人可以尝试运行此程序并帮助我找到我的错误。预先谢谢你

1 个答案:

答案 0 :(得分:1)

Matlab的activecontour函数默认使用Chan-Vese(active contours without edges)方法,如Cris所说。该实现引用了Whitaker, "A level-set approach to 3d reconstruction from range data",“使用稀疏字段级别集方法,类似于[3]中描述的方法”。 (除了Chan–Vese,activecontour还有一个可选的method arg,可以将其设置为'edge'以使用基于(较旧)geodesic active contours方法的替代“基于边缘的模型” Caselles,Kimmel和Sapiro。)

Chan-Vese方法通过寻找等值线轮廓内的“ c1”和等高线轮廓外的“ c2”的二值图像来分割灰度图像,这两个图像均具有平滑的轮廓并且非常近似于原始图像。该方法从一些初始轮廓开始,通过迭代过程对其进行优化,从而优化了c1,c2和轮廓形状。

如果您不愿意引用自己的名字,可以在http://www.ipol.im/pub/art/2012/g-cv/的IPOL期刊上找到有关Chan-Vese的文章,开源C代码和在线演示,这可能会有所帮助。

那么在您的情况下为什么不起作用?一些想法:

  • 在您使用时,由于输入图像已经是 二进制文件,因此该方法很容易将方法简单地设置为c1 = 0,c2 = 1,并将轮廓设置为输入,因此“什么也没有发生”。尝试设置可选的“ SmoothFactor” arg(可能设置为较大的值),以强制该方法寻找更平滑的轮廓。

  • 可以想象这是一个数据类型问题,因为图像I作为逻辑数组传递到activecontour,但是通常该函数采用数字数组。尝试在传递之前将I转换为双精度数组。