【问题标题】:Active contour snake主动轮廓蛇
【发布时间】:2021-01-12 15:52:42
【问题描述】:

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

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

【问题讨论】:

  • 为什么要在二进制图像上运行蛇?为什么要丢掉灰度图像中的信息,让它的工作变得更加困难?
  • 起初我尝试了基于活动区域的技术。我尝试使用灰度图像,但是分割效果不是很好,所以我决定尝试使用二值图像技术。得到的二值图像将与 RGB 图像融合在一起作为最终图像。我改成二值的原因是为了得到想要的区域,因为灰度有一些不必要的东西,它不能分割我想要的区域。实际上,我使用蛇与基于活动区域的比较。为了公平起见,我将其更改为二进制图像。不幸的是,当我合并代码时它不起作用。
  • 查看您正在使用的功能的文档,您似乎正在使用 Chan-Vese 活动轮廓。这是水平集方法,而不是蛇。这是一个完全不同的算法。
  • 请发布您的输入图像,以便我们重现您的结果。如果我们看不到发生了什么,就无法知道问题出在哪里。
  • mathworks.com/help/images/ref/activecontour.html- 我从这个网站复制了代码。这就是蛇。或者实际上我在这里误解了?

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


【解决方案1】:

Matlab 的 activecontour 函数默认使用 Chan–Vese (active contours without edges) 方法,就像 Cris 所说的那样。该实现“使用 Sparse-Field 水平集方法,类似于 [3] 中描述的方法”,引用 Whitaker, "A level-set approach to 3d reconstruction from range data"。 (除了 Chan–Vese,activecontour 有一个可选的 method 参数,可以设置为 'edge' 以使用基于(旧)Caselles、Kimmel 和萨皮罗。)

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

如果您愿意为自引辩解,您可以在 IPOL 期刊 http://www.ipol.im/pub/art/2012/g-cv/ 上找到一篇关于 Chan–Vese 的文章、开源 C 代码和在线演示,这可能会对您有所帮助。

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

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

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

【讨论】:

  • 您好,先生,谢谢您的回答。肯定会尝试让我加倍。但是,你能帮我找到真正的蛇编码吗?我需要原始的活动轮廓编码作为 chan vese 方法,据我所知,活动轮廓的更新版本对吗?如果我错了,请纠正我。我还是新手,我很难理解chan vese方法本身的基本原理,但谢谢你的回答,我今天得到了新信息(:
  • 对不起先生,我的意思是也许你可以建议我找到原始的蛇代码。也许我可以参考一些来源。无论如何,我已经尝试了你的建议并且它奏效了。非常感谢。
  • “Snakes”是一系列方法,它不止一种方法。您可以在 Matlab Central File Exchange 上找到一些实现,例如 "Snake : Active Contour"。有一个snakes in scikit-image 的 Python 实现。或者,如果您想自己实现它,snakes pseudocode on Wikipedia 将是一个很好的起点。
  • 好的先生,我试试看。非常感谢您的帮助。
猜你喜欢
  • 2016-03-14
  • 2018-01-25
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 2015-07-06
  • 1970-01-01
相关资源
最近更新 更多