基于C++的opencv(十)图像轮廓与图像分隔修复

一、查找并绘制轮廓

在opencv中findContours()函数从二值图像中查找轮廓。

1.1.寻找轮廓:findContours()函数

findContours经常与drawContours配合使用一起用findContours()函数检测到图像的轮廓后,便可以用drawContours()函数将检测到的轮廓绘制出来

1.2.绘制轮廓:drawContours()函数

1.3.轮廓查找示例程序

1.4.查找并绘制轮廓示例

二、寻找物体的凸包

2.1.凸包

凸包(Convex Hull)是一个计算几何(图形学)中常见的概念。简单来说,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形,它是能包含点集中所有点的。理解物体形状或轮廓的一种比较有用的方法便是计算一个物体的凸包,然后计算其凸缺陷(convexity defects)。

2.2.寻找凸包:convexHull()函数

三、使用多边形将轮廓包围

3.1.返回外部矩形边界:boundingRect()函数

此函数计算并返回指定点集最外面(up-right)的矩形边界。

3.2.寻找最小包围矩形:minAreaRect()函数

此函数用于对给定的2D点集,寻找可旋转的最小面积的包围矩形。

3.3.寻找最小包围圆形:minEnclosingCircle函数

minEnclosingCircle函数的功能是利用一种迭代算法,对给定的2D点集,去寻找面积最小的可包围它们的圆形。

3.4.用椭圆拟合二维点集:fitEllipse()函数

此函数的作用是用椭圆拟合二维点集。

3.5.逼近多边形曲线:approxPolyDp()函数

approxPolyDP函数的作用是用指定精度逼近多边形曲线。

3.6.创建包围轮廓的矩阵边界示例

3.7.创建包围轮廓的圆形边界示例

3.8.使用多边形包围轮廓示例

四、图像的矩

一阶矩与形状有关,二阶矩显示曲线围绕直线平均值的扩展程度,三阶矩则是关于平均值的对称性的测量。

opencv中图像的矩一般由moments、contourArea、arcLength这三个函数配合求取。
1.使用moments计算图像所有的矩(最高到3阶);
2.使用contourArea来计算轮廓面积;
3.使用arcLength来计算轮廓或曲线长度。

4.1.矩的计算:moments()函数

moments()函数用于计算多边形和光栅形状的最高达三阶的所有矩。矩用来计算形状得到重心、面积,主轴和其他形状特征等。

4.2.计算轮廓面积:contourArea()函数

contourArea()函数用于计算整个轮廓或部分轮廓面积。

4.3.计算轮廓长度:arcLength()函数

arcLength()函数用于计算封闭轮廓的周长或曲线的长度。

4.4.查找和绘制图像轮廓矩示例

五、分水岭算法

分水岭算法(watershed algorithm)是一种基于拓扑理论的数学形态学的分隔方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水盆的边界则形成分水岭。

分水岭计算分两个步骤:一个是排序过程,一个是淹没过程。首先对每个像素的灰度级进行从低到高的排序,然后在从低到高实现淹没的过程中,对每一个局部极小值在h阶高度的影响域采用先进先出(FIFO)结构进行判断及标注。分水岭变换得到的是输入图像的集水盆图像,集水盆之间的边界点,即为分水岭。显然,分水岭表示的是输入图像的极大值点。

5.1.实现分水岭算法:watershed()函数

5.2.分水岭算法示例

六、图像修补

在实际应用中,我们的图像经常会被噪声腐蚀,这些噪声或者是镜头上的灰尘或水滴,或者是旧照片的划痕,或者由于图像的部分本身已经损坏。而“图像修复”(Inpainting),简单来说就是利用那些已经被破坏区域的边缘,即边缘的颜色和结构,繁殖和混合到损坏的图像中,以达到图像修补的目的。

6.1.实现图像修补:inpaint()函数

6.2.图像修补示例

你可能感兴趣的:(c++,OpenCV,opencv,图像处理)