轮廓相比边缘,更加连贯为一个整体
轮廓检测方法
RETR_TREE 常用
为了结果准确,使用二值图像
过程:
img = cv2.imread("img.jpg")
gray = cv2.cvtColor(cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 二值化
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
绘制:

- 第二个参数:要是一个 list ,所以如果只有一个轮廓要用[]括起来。
- 第三个参数:轮廓的索引,-1 代表所有的轮廓
- 第四个参数:BGR,绘制用的颜色
- 第五个参数:线条宽度
利用轮廓进行分析:
con = contours[0] # 分析的时候要拿出某条具体轮廓
area = cv2.contourArea(con)
length = cv2.arcLength(con, True) # True表示视为闭合的曲线,False只计算点之间距轮廓近似:

epsilon = 0.1 * cv2.arcLength(con, True)
approx = cv2.approxPolyDP(con, epsilon, True) - 第二个参数:从轮廓到近似轮廓的最大距离,一般与周长有关
- 第三个参数:代表轮廓要不要闭合
外接矩形:
x, y, w, h = cv2.boundingRect(con)
img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)用于算面积比,或者额外特征
外接圆:
(x, y), radius = cv2.minEnclosingCircle(con)
centre = (int(x), int(y))
radius = int(radius)
img = cv2.circle(img, centre, radius, (0, 255, 0), 2)模板匹配
用模板作为滑动窗口覆盖原图,从左到右从上到下依次匹配
(尽量用归一化的)
所有匹配比对结果:
res = cv2.matchTemplate(img, template, cv2.TM_SQDIFF)找到最佳匹配:
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

匹配多个对象

图像金字塔
图像特征提取,每层提取,随后总结
高斯金字塔
向下采样 (缩小)
沿着金字塔从下往尖走

向上采样(放大)
由尖向底

例子:
up = cv2.pyrUp(img) # 上采样
img
up
down
左原始,右先上后下,略模糊了
拉普拉斯金字塔
G 为原始输入

down = cv2.pyrDown(img)
down_up = cv2.pyrUp(down)
laplace = img - down_up