轮廓相比边缘,更加连贯为一个整体

轮廓检测方法

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