我实际上在做头部侧轮廓检测。由于图片是在白色墙壁前拍摄的,所以我决定在带有阈值处理的图像上运行蛇 (活动轮廓模型算法)。
问题是蛇不能很好地适应鼻子,嘴和嘴下面(如你可以在下面的图片中看到)。
//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)点组成的线。
输入图像:
输出蛇:
任何帮助或想法都将不胜感激。谢谢!
发布于 2014-03-06 00:43:54
一种典型的蛇形或活动轮廓算法在3种代价函数之间进行权衡时收敛:边缘强度/距离(数据项)、间距和平滑度(先验项)。立即,你可能会注意到你的“鼻子问题”-鼻子有很高的曲率。你的蛇也有困难进入凹区,因为这肯定增加了它的曲率相比凸包。
解决办法:
答:既然你的蛇的性能并不比凸包好,作为补救措施之一,我会继续一个简单的凸包算法,然后在它的反向残差上重新运行它。它会得到一个鼻子的权利,然后孔洞将变成凸性,在残差。或者可以使用openCV的凸性缺陷函数,而不是使用convexHull。
另一种解决办法是减少蛇的曲率参数,使其能够在鼻子周围急剧弯曲。因为你的噪音很小,而且你实际上可以把它弄干净一点,所以我看不出强制执行一些约束而不是进行“更软”的权衡的问题。也许一个头部轮廓的先验模型也能在这里有所帮助。
下面,我尝试使用各种距离变换和距离参数的权重来编写自己的snake算法。结论-参数比距离度量更重要,并且确实有一定的效果(左图片使用的参数比右边的小,因此割鼻子更多)。与轮廓(红色)的距离用灰色表示,蛇是绿色的。
因为你的背景几乎是纯色,所以投资于清理一些残留的噪音(使用形态学操作或连接组件),只需要清洁轮廓的findContrours()。我在下面实现了最后一个解决方案:第一个图像有噪声删除,第二个只是来自openCV的轮廓函数。
发布于 2013-08-26 06:40:40
如果你想自己实现,我推荐吉姆·艾文斯和约翰·波里尔的论文“你一直想要的关于蛇的一切(但不敢问)”。
关于OpenCV实现,我不太清楚,但我建议您:
我希望它能帮到你。祝好运!
发布于 2015-05-11 22:35:18
活动轮廓只是一个糟糕的时期。看起来,最大流最小切割可以很容易地解决这一图像分割问题。
我知道这是一段时间前的问题,但我被一般的活动轮廓激怒了。这个页面是Google上最热门的页面之一,我想很多人会读到这篇文章,希望有人能通过pdes做一些有用的关于轮廓演变的事情。
事实是,积极的轮廓需要大量的人工干预,只有当你有非自然的边缘力量或非常高的对比度时,它才有效。
如果你对PhD或博士后感兴趣--我求你找点别的东西。我保证会有令人震惊的结果。虽然表面上有很好的轮廓模型,但源代码从来没有提供过--例如,在一个级别集内提供了通用的gvf。
所有(二进制)分割问题都可以分解成一个有向图-你未来的雇主和考官会感谢我的。我敦促你不要把时间浪费在活动轮廓上。
https://stackoverflow.com/questions/17538366
复制相似问题