本章我们在学习一下基于索引表的细化算法。

假设要处理的图像为二值图,前景值为1,背景值为0。

索引表细化算法使用下面的8邻域表示法:

OpenCV学习(18) 细化算法(6)

一个像素的8邻域,我们可以用8位二进制表示,比如下面的8邻域,表示为00111000=0x38=56

OpenCV学习(18) 细化算法(6)

我们可以枚举出各种情况下,当前像素能否删除的表,该表大小为256。它的索引即为8邻域表示的值,表中存的值为0或1,0表示当前像素不能删除,1表示可以删除。deletemark[256]

比如下图第一个表示,索引值为0,它表示孤立点,不能删除,所以deletemark[0]=0,第二个表示索引值为17,它表示端点,也不能删除,所以deletemark[17]=0,第三个表示索引为21,删除的话会改变连通域数量,所以deletemark[21]=0,第四个表示索引值为96,此时可以删除,所以deletemark[96]=1。

OpenCV学习(18) 细化算法(6)

最终我们会定义一张完整的表来表示当前像素能否删除。

索引表细化算法描述很简单。

1.找到轮廓,其值用4表示

2.查找值为4的轮廓,查找索引表判断能否删除,能删除的话把它置为0。

循环迭代1,2直到再也没有可以删除的点为止。

下面的算法的代码:

break;
}
OpenCV学习(18) 细化算法(6)

上面的算法可以看到细化后的轮廓偏右了,我们可以更改删除的循环条件,把循环拆分成三个,修改后的代码如下:

break;
}

}

修改后的结果:

OpenCV学习(18) 细化算法(6)

OpenCV学习(18) 细化算法(6)OpenCV学习(18) 细化算法(6)

程序源代码:工程FirstOpenCV11

相关文章:

  • 2021-11-18
  • 2022-12-23
  • 2021-11-07
  • 2021-05-31
  • 2021-06-28
  • 2021-11-19
猜你喜欢
  • 2021-06-03
  • 2021-05-23
  • 2021-12-19
  • 2021-05-25
  • 2022-01-14
  • 2021-07-23
  • 2021-05-18
相关资源
相似解决方案