1.Դ?源码?ʵ??findcontours
2.图像轮廓和分水岭算法
Դ??ʵ??findcontours
OpenCV的Findcontours()函数原理来源于一篇名为《Topological Structural Analysis of Digitized Binary Images by Border Following》的论文。该论文详细介绍了算法的实现实现,并提供了算法的源码源代码。
在论文中,实现对于一些关键定义进行了阐述:
1. 轮廓点:在一个4-或8-邻域内,源码如果存在一个像素为0的实现hue 4.1 源码点,则该点为轮廓点。源码
2. 连通区域的实现环绕:对于两个相邻的连通区域S1和S2,如果S1上任意一个点的源码四个方向都能到达S2,那么S2环绕S1。实现
3. 外轮廓和孔轮廓:外轮廓是源码指像素为1的连通域内被像素为0的连通域环绕的轮廓点,孔轮廓是实现指像素为0的连通区域被像素为1的连通区域环绕的轮廓点。
4. 父轮廓:定义了层级关系,源码例如,实现对于一个像素为1的源码连通区域S1和一个像素为0的连通区域S2,如果S2环绕S1,则S1的父轮廓为环绕S2的值为1的像素。
轮廓扫描过程中,从左到右、源码网站导航从上到下的顺序扫描,根据扫描到的边界起始点判断轮廓类型。找到起始点后,根据上一个轮廓的编号判断父轮廓。最后,通过border following找到该轮廓的所有点。
在实现过程中,需要定义输入,初始化NBD为1,绝密操盘源码LNBD为1。在每一行扫描开始时,LNBD重置为1。根据当前扫描到的像素值,不断更新当前点,并绕着该点逆时针旋转寻找下一点,并不断更新像素值。
在实现过程中,遇到了一个问题,b点源码即当像素左边和右边同时为0时,需要进行特殊处理。因为轮廓是逆时针寻找,所以可以通过寻找的方位判断该赋值NBD还是-NBD。具体实现可以参考代码。
修正后,结果与论文一致。有兴趣的朋友可以查看代码。
结果图展示了轮廓编号、通吃指标源码frame边缘、子轮廓、父轮廓、轮廓开始索引和轮廓类型等信息。
图像轮廓和分水岭算法
图像轮廓和分水岭算法在图像处理中扮演着关键角色。findContours()函数是寻找二值图像中轮廓的核心工具,它能检测轮廓后,通过drawContours()函数将这些轮廓清晰地呈现出来,便于分析和理解图像结构。
drawContours()函数则用于在原始图像中精确地绘制轮廓,无论是外部轮廓还是内部结构,都能清晰可见。例如,通过运用图像平滑技术(blur()函数)和边缘检测技术(canny()函数),可以动态地根据滑动条调整,实时显示出图形的轮廓变化。
对于分水岭算法,它在图像分割中有独特应用。尽管具体的例子代码没有在文中给出,但通过该算法,图像可以被分割成不同的区域,像是水在地形中的自然流动。分水岭算法的结果通常以视觉效果的形式展示,直观地揭示图像的结构差异。
如果你对图像处理算法感兴趣,特别是OpenCV的相关技术,不妨关注我的微信公众号“OpenCV图像处理算法”。在这里,我将分享我在学习过程中的经验,包括特征提取、目标跟踪、定位、机器学习和深度学习等多个领域的实例,每篇文章都包含详细的源码和相关资料,期待与你一同探索和学习。