边缘与轮廓
- 基于图像边缘提取或二值化的基础寻找对象轮廓
- 边缘提取的阈值会最终影响轮廓发现的结果
- 主要API要有以下俩个
findContours
发现轮廓drawContours
绘制轮廓
查找轮廓
处理的图像,轮廓列表,继承关系 = cv.findContours(图像,轮廓检索模式,检索的方法)
# hierarchy[i][3],分别表示第i个轮廓的后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号
- 轮廓检索模式
RETR_EXTERNAL | 只检测最外层轮廓 |
---|---|
RETR_LIST | 提取所有轮廓,并放置在list中,检测的轮廓不建立等级关系 |
RETR_CCOMP | 提取所有轮廓,并将轮廓组织成双层结构(two-level hierarchy),顶层为连通域的外围边界,次层位内层边界 |
RETR_TREE | 提取所有轮廓并重新建立网状轮廓结构 |
- 轮廓检索算法
CHAIN_APPROX_NONE | 获取每个轮廓的每个像素,相邻的两个点的像素位置差不超过1 |
---|---|
CHAIN_APPROX_SIMPLE | 压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的重点坐标,如果一个矩形轮廓只需4个点来保存轮廓信息 |
CHAIN_APPROX_TC89_L1 | Teh-Chinl链逼近算法 |
CHAIN_APPROX_TC89_KCOS | Teh-Chinl链逼近算法 |
绘制轮廓
cv.drawContours(图像,轮廓列表,轮廓索引-1则绘制所有,轮廓颜色,轮廓的宽度)
绘制外切圆
cv.drawContours(图像,轮廓列表,轮廓索引-1则绘制所有,轮廓颜色,轮廓的宽度)
实现步骤:
- 读取图片
- 将图片转换成一张灰色图片
- 对图片进行二值化处理
- 使用findContours查找轮廓
- 对轮廓进行处理
示例代码
import cv2 as cv
def read_rgb_img(img_name):
rgb_img = cv.imread(img_name, cv.IMREAD_COLOR)
cv.imshow("rgb img", rgb_img)
return rgb_img
def convert_rgb2gray(img):
gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow("gray img", gray_img)
return gray_img
def convert_gray2binary(img):
binary_img = cv.adaptiveThreshold(img,
255,