轮廓检测(python+opencv)

轮廓可以理解为图像中具有相同颜色或密度的位于边界的连续点的集合,轮廓是形状分析和对象识别的有利工具。
在python-OpenCV中,我们常用findContours函数来计算轮廓,每个独立的轮廓都是以Numpy array的点坐标的形式呈现。
为了在图像中显示出计算出的轮廓,我们使用drawContours函数。通常这个函数会配合findContours使用。

官方文档相关api

轮廓检测

contours, hierarchy=cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])

image:源图像,8位单通道图像,非0像素值均按像素值为1处理,该函数在提取轮廓的过程中会改变图像
contours:轮廓信息,每个轮廓由点集组成,而所有的轮廓构成了contours列表
hierarchy:可选参数,表示轮廓的层次信息(拓扑信息,有种树结构的感觉),每个轮廓元素contours[i]对应4个hierarchy元素hierarchy[i][0]~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓和内嵌轮廓的编号,若无对应项,则该参数为负值
mode:轮廓检索模式

cv2.RETR_EXTERNAL:只检测最外层轮廓,并置hierarchy[i][2]=hierarchy[i][3]=-1
cv2.RETR_LIST:提取所有轮廓并记录在列表中,轮廓之间无等级关系
cv2.RETR_CCOMP:提取所有轮廓并建立双层结构(顶层为连通域的外围轮廓,底层为孔的内层边界)
cv2.RETR_TREE:提取所有轮廓,并重新建立轮廓层次结构

method:轮廓逼近方法

cv2.CHAIN_APPROX_NONE:获取每个轮廓的每个元素,相邻像素的位置差不超过1,即连续的点,但通常我们并不需要所有的点
cv2.CHAIN_APPROX_SIMPLE:压缩水平方向、垂直方向和对角线方向的元素,保留该方向的终点坐标,如矩形的轮廓可用4个角点表示,这是一种常用的方法,比第一种方法能得出更少的点
cv2.CHAIN_APPROX_TC89_L1和cv2.CHAIN_APPROX_TC89_KCOS:对应Tch-Chain链逼近算法

offset:偏移 (反正我没用过)

Optional offset by which every contour point is shifted. This is useful if the contours are extracted from the image ROI and then they should be analyzed in the whole image context.可选的偏移,就是简单的平移,特别是在做了ROI步骤之后有用。

轮廓绘制

cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]])

image:目标输出图像
contours:所有的轮廓,可直接传入findContours函数中的contours参数
contourIdx:轮廓的索引,即绘制哪个轮廓,若为负值则绘制所有轮廓
color:绘制的颜色,元祖形式,如(255)或(255, 255, 255)
thickness:绘制的轮廓的线条粗细程度,若为负数,表示要填充整个轮廓

practice

这里写图片描述
原始图像

[python+opencv]

import cv2
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from pandas import Series, DataFrame
img = cv2.imread('./lung.jpg')
plt.imshow(img)
plt.show()
grayImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,binImg = cv2.threshold(grayImg, 100, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binImg, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0, 200, 255), 2)
plt.imshow(img)
plt.show()
hierarchyDF = DataFrame(hierarchy[0], columns = ['pre', 'next', 'child', 'parent'])

这里写图片描述
这里写图片描述
可以得到7个轮廓,在这里首先在图上进行了简单的标记。
查看hierarchy可得:
这里写图片描述
对应的层次结构可以表示为:


+------+
|      |
1      4
|      |
+--+   5
|  |   |
2  3   3

  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值