首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Snake算法- opencv活动轮廓-工作不太好

Snake算法- opencv活动轮廓-工作不太好
EN

Stack Overflow用户
提问于 2013-07-09 01:06:11
回答 4查看 22.8K关注 0票数 7

我实际上在做头部侧轮廓检测。由于图片是在白色墙壁前拍摄的,所以我决定在带有阈值处理的图像上运行 (活动轮廓模型算法)。

问题是蛇不能很好地适应鼻子,嘴和嘴下面(如你可以在下面的图片中看到)。

代码语言:javascript
运行
复制
//load file from disk and apply threshold
IplImage* img = cvLoadImage (file.c_str (), 0);
cvThreshold(img, img, 170, 255, CV_THRESH_BINARY);

float alpha = 0.1; // Weight of continuity energy
float beta = 0.5; // Weight of curvature energy
float gamma = 0.4; // Weight of image energy

CvSize size; // Size of neighborhood of every point used to search the minimumm have to be odd
size.width = 5;
size.height = 5;

CvTermCriteria criteria;
criteria.type = CV_TERMCRIT_ITER;  // terminate processing after X iteration
criteria.max_iter = 10000; 
criteria.epsilon = 0.1;

// snake is an array of cpt=40 points, read from a file, set by hand
cvSnakeImage(img, snake, cpt, &alpha, &beta, &gamma, CV_VALUE, size, criteria, 0);

我试图更改alpha/beta/gamma参数或迭代数,但没有发现比下面的输出结果更好的结果。我不明白为什么鼻子被割了,嘴巴周围的脸也不合适。我想曲率有足够的点,但是仍然有一些由几个(>2)点组成的线。

输入图像:

输出蛇:

  • 蓝色:手工设置的点数
  • 绿色:输出蛇

任何帮助或想法都将不胜感激。谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-03-06 00:43:54

一种典型的蛇形或活动轮廓算法在3种代价函数之间进行权衡时收敛:边缘强度/距离(数据项)、间距和平滑度(先验项)。立即,你可能会注意到你的“鼻子问题”-鼻子有很高的曲率。你的蛇也有困难进入凹区,因为这肯定增加了它的曲率相比凸包。

解决办法:

答:既然你的蛇的性能并不比凸包好,作为补救措施之一,我会继续一个简单的凸包算法,然后在它的反向残差上重新运行它。它会得到一个鼻子的权利,然后孔洞将变成凸性,在残差。或者可以使用openCV的凸性缺陷函数,而不是使用convexHull

另一种解决办法是减少蛇的曲率参数,使其能够在鼻子周围急剧弯曲。因为你的噪音很小,而且你实际上可以把它弄干净一点,所以我看不出强制执行一些约束而不是进行“更软”的权衡的问题。也许一个头部轮廓的先验模型也能在这里有所帮助。

下面,我尝试使用各种距离变换和距离参数的权重来编写自己的snake算法。结论-参数比距离度量更重要,并且确实有一定的效果(左图片使用的参数比右边的小,因此割鼻子更多)。与轮廓(红色)的距离用灰色表示,蛇是绿色的。

因为你的背景几乎是纯色,所以投资于清理一些残留的噪音(使用形态学操作或连接组件),只需要清洁轮廓的findContrours()。我在下面实现了最后一个解决方案:第一个图像有噪声删除,第二个只是来自openCV的轮廓函数。

票数 12
EN

Stack Overflow用户

发布于 2013-08-26 06:40:40

如果你想自己实现,我推荐吉姆·艾文斯和约翰·波里尔的论文“你一直想要的关于蛇的一切(但不敢问)”。

关于OpenCV实现,我不太清楚,但我建议您:

  • 减少β,这样曲率可能会更强
  • 检查影像能量。可能函数(方案)的最后一个参数是错误的。有两个可能的值:_CV_SNAKE_IMAGE和_CV_SNAKE_GRAD。如果我没有错的话,你把它设为0,我认为0表示_CV_SNAKE_IMAGE。因此,函数将假设输入图像是能量图像。同样,我不确定OpenCV是如何实现这个函数的,但是我认为当您使用_CV_SNAKE_IMAGE时,函数假设输入图像是一个梯度模块图像。在您的情况下,它可以使蛇避免黑色区域(解释为低梯度模块),并寻求光明的区域。因此,尝试使用_CV_SNAKE_GRAD作为您的最后一个参数。

我希望它能帮到你。祝好运!

票数 6
EN

Stack Overflow用户

发布于 2015-05-11 22:35:18

活动轮廓只是一个糟糕的时期。看起来,最大流最小切割可以很容易地解决这一图像分割问题。

我知道这是一段时间前的问题,但我被一般的活动轮廓激怒了。这个页面是Google上最热门的页面之一,我想很多人会读到这篇文章,希望有人能通过pdes做一些有用的关于轮廓演变的事情。

事实是,积极的轮廓需要大量的人工干预,只有当你有非自然的边缘力量或非常高的对比度时,它才有效。

如果你对PhD或博士后感兴趣--我求你找点别的东西。我保证会有令人震惊的结果。虽然表面上有很好的轮廓模型,但源代码从来没有提供过--例如,在一个级别集内提供了通用的gvf。

所有(二进制)分割问题都可以分解成一个有向图-你未来的雇主和考官会感谢我的。我敦促你不要把时间浪费在活动轮廓上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17538366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档