OpenCV图像处理(三、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*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值