引言: 本次轮廓检测的介绍基于opencv中的findContours()函数,首先介绍了它的数学原理,然后对其参数进行分析,最后结合drawContours()函数给出了一个轮廓检测的运用实例。
一、轮廓检测原理
opencv中轮廓检测函数的原理基于一篇早期的图像边缘跟踪论文:《Topological Structural Analysis of Digitized Binary Images》,有兴趣的人可以去找来学习一下,此次将大体介绍一下其中关于轮廓检测部分的算法。
首先明确几个基本概念和符号表示:
轮廓检测所针对的是二值化的边缘图像,图像的上下左右边界构成了图像的框架(frame),一般情况下图像的框架都为0像素,图像中由连通的0像素占据的区域叫做0连通域(0-component),同理的得到1连通域(1-componetn),如果存在0连通域S包含了图像的框架,则称S为背景(background);
图像中第i行第j列的像素用
(
i
,
j
)
(i,j)
(i,j)表示,像素值用
f
i
,
j
f_{i,j}
fi,j表示,则此图像可由
F
=
f
i
,
j
F={f_{i,j}}
F=fi,j表示;
当使用4(8)连通对某个像素的连通性进行描述时,如该像素为1则指4(8)连通,如该像素为0则指8(4)连通;
**bia
边界点(borderpoint):在4(8)连通的情况下,如果某个1像素点
(
i
,
j
)
(i,j)
(i,j)在他的8连通域中有0像素点
(
p
,
q
)
(p,q)
(p,q),那么这个1像素点就称作是边界点。实际上描述的就是判断1连通域(
(
i
,
j
)
(i,j)
(i,j)的父集合)和0连通域(
(
p
,
q
)
(p,q)
(p,q)的父集合)的交界处,取其交界线上1像素点作为边界点。
二、轮廓在opencv中的应用
参考文献
OpenCV轮廓提取算法详解findContours()
Topological Structural Analysis of Digitized Binary Images by Border Following