我正在尝试使用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')
从蛇的代码开始不会发生任何过程。它最终只会生成二进制图像。我希望有人可以尝试运行此程序并帮助我找到我的错误。预先谢谢你
答案 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
转换为双精度数组。