OpenCV中的轮廓
1.初识轮廓
1.1 原理
轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。
- 使用二值化图像可以更准确识别轮廓。寻找轮廓之前要进行阈值化处理或Canny边界检测;
- 查找轮廓会修改原始图像;
- OpenCV中查找轮廓类似于在黑色背景中找白色物体。背景是黑色,物体是白色。
1.2 常用函数
- 查找轮廓:cv2.findContours()。第一个是输入图像,第二个是轮廓检索模式,第三个是轮廓近似方法。
- 绘制轮廓:cv2.drawContours()。第一个参数是原始图像,第二个参数是轮廓,第三个是轮廓的索引(-1表示绘制所有轮廓)。
- 轮廓的近似方法:
- cv2.CHAIN_APPROX_NONE,存储所有边界点;
- cv2.CHAIN_APPROX_SIMPLE,只存储有用的点,去掉冗余点,压缩轮廓。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import cv2
img = cv2.imread("/Users/~~/img.png")
imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
# 查找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
img = cv2.drawContours(img, contours, 50, (0, 255, 0), 3)
plt.imshow(img, cmap='gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
结果:
2.轮廓的特征
2.1 矩
图像的矩可以用来计算图像的质心,面积等。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import cv2
img = cv2.imread("/~~/ig.png", 0)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
contours, hierarchy = cv2.findContours(thresh, 1, 2)
cnt = contours[0]
M = cv2.moments(cnt)
print(M)
# 绘制轮廓
# 重心
cx = int(M['m10']/M['m00']) #255
cy = int(M['m01']/M['m00']) #480
#面积‘
area = cv2.contourArea(cnt) #30700
#周长
# cv2.arcLength()的第二个参数用来指定对象的形状是闭合(True)的还是打开的(一条曲线)。
perimeter = cv2.arcLength(cnt, True) #1162.97
2.2 轮廓近似
将轮廓近似到另一种由更少点组成的轮廓形状。
approx = cv2.approxPolyDP(cnt,epsilon,True)
epsilon:原始轮廓到近似轮廓的最大距离;
True:弧线是否闭合。
# epsilon = 10% 时的近似轮廓
epsilon = 0.1*