python-opencv(11)图像轮廓

python-opencv(10)图像轮廓

文章目录

      • 1. 什么是轮廓
      • 2. 使用的函数
      • 3. 代码实现

1. 什么是轮廓

边缘检测能够检测出边缘,但是边缘不是连续的,如果我们将边缘 连接为一个整体,我们便构造出了轮廓。
注意

  1. 对于opencv来说构建轮廓的对象是二值图像。所以我们首先要进行阈值分割或者边缘检测的处理。
  2. 查找轮廓,会更改原始的图像,所以,我们们通常使用原始的图像,拷贝一份在进行操作。
  3. 在opencv中,是从黑色的背景中查找白色对象,因此对象必须是白色,而背景必须是黑色。

2. 使用的函数

  1. cv2.findContours( ) 查找轮廓图像的函数。
  2. cv2.drawContours( ) 将查找到的轮廓绘制到图像上。

首先看第一个函数cv2.findContours( )
1.contours, hierarchy = cv2.findContours( image, mode, method)
相关参数的释义
contours 为轮廓
hierarchy 为图像的拓扑信息(轮廓的层次)
image 为原始图像


mode 为轮廓的检索模式

  • cv2.RETR_EXTERNAL :表示只检测外轮廓
  • cv2.RETR_LIST :检测的轮廓不建立等级关系
  • cv2.RETR_CCOMP :建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
  • cv2.RETR_TREE :建立一个等级树结构的轮廓(常用这一个

-method 为轮廓的近似方法

  • cv2.CHAIN_APPROX_NONE :存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2), abs(y2-y1)) ==1
  • cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
  • cv2.CHAIN_APPROX_TC89_L1:使用teh-Chinl chain 近似算法
  • cv2.CHAIN_APPROX_TC89_KCOS:使用teh-Chinl chain 近似算法
    python-opencv(11)图像轮廓_第1张图片
    2.r=cv2.drawContours(o, contours, contourIdx, color[, thickness])
    r 为目标图像
    o 原始图像
    contours 需要绘制的边缘数组
    contourldx 需要绘制的边缘索引,如果全部绘制,则为-1
    color 绘制的颜色,位BGR格式的Scalar
    thickness 可选,绘制是时所用的画笔的粗细

3. 代码实现

#%%图像轮廓的绘制
import cv2
import numpy as np
import os
img = cv2.imread(r"C:\\Users\\lihuanyu\\Desktop\\opencv\\image\\boyun.png")
#拷贝一份
img1 = img.copy()
#转换为黑色
gray = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
#阈值分割-二值化
ret,binary = cv2.threshold(gray,127,225,cv2.THRESH_BINARY)
#轮廓的提取
#image,contours,hierarchy = cv2.findContours(img2,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
contours, hierarchy =cv2.findContours(binary,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
o=cv2.drawContours(img1,contours,-1,(0,255,0),5)
cv2.imshow("origial",img)
cv2.imshow("result",o)
cv2.waitKey()
cv2.destroyAllWindows()

结果
python-opencv(11)图像轮廓_第2张图片

Python+OpenCV计算机视觉 - 李立宗

你可能感兴趣的:(python-opencv)