首页 > 解决方案 > 主动轮廓蛇

问题描述

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

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

标签: matlabimage-processingcomputer-visionimage-segmentationcontour

解决方案


Matlab 的activecontour函数默认使用 Chan-Vese(没有边缘的活动轮廓)方法,就像 Cris 说的那样。该实现“使用稀疏场水平集方法,类似于 [3] 中描述的方法”,引用了Whitaker,“A level-set approach to 3d rebuild from range data”。(除了 Chan–Vese,activecontour还有一个可选的methodarg 可以设置为“edge”,以使用基于Caselles、Kimmel 和 Sapiro的(较旧的)测地线活动轮廓方法的替代“基于边缘的模型”。)

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

如果您不介意自引,您可以在 IPOL 期刊上找到一篇文章、开源 C 代码和在线演示,网址为http://www.ipol.im/pub/art/2012/g -cv/,您可能会发现它很有帮助。

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

  • 在您的使用中,由于输入图像已经是二进制的,因此该方法显然很诱人,只需将 c1=0、c2=1 和轮廓设置为输入边缘,因此“什么都没有发生”。尝试设置可选的 'SmoothFactor' arg(可能设置为较大的值)以强制该方法寻找更平滑的轮廓。

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


推荐阅读