opencv---边沿检测、轮廓、轮廓特征、轮廓层级

边缘检测,框出物体的轮廓(使用opencv-python)
OpenCV 中的轮廓应用
感兴趣区域的移动物体检测,框出移动物体的轮廓 (固定摄像头, opencv-python)
OpenCV图像处理-轮廓和轮廓特征

图像二值化

做轮廓检测,必须先把图像二值化。而二值化主要考虑如何做到阈值自适应,尤其是局部阈值自适应
OpenCV—图像二值化
图像二值化,阈值处理(十)

相关概念:
数学形态学操作
OpenCV图像处理|1.11 形态学操作
图像卷积、边缘提取和滤波去噪
图像边缘检测 - 图像梯度与Canny算子
OpenCV图像处理-Cany、Sobel、Laplacian算子和图像金字塔
OpenCV—python 图像显著性检测算法—HC/RC/LC/FT

轮廓处理的一般流程:
在这里插入图片描述

  • 知识点1:
    需要注意的是cv2.findContours()函数接受的参数为二值图,即黑白的(不是灰度图),所以读取的图像要先转成灰度的,再转成二值图。,参见4、5两行。第六行是检测轮廓,第七行是绘制轮廓。
import cv2  
  
img = cv2.imread('D:\\test\\contour.jpg')  
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)  
  
contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)  
cv2.drawContours(img,contours,-1,(0,0,255),3)  
  
cv2.imshow("img", img)  
cv2.waitKey(0)  
  • 知识点2
    OpenCV中轮廓等级的表示:
    如果我们打印出cv2.findContours()函数的返回值hierarchy,会发现它是一个包含4个值的数组:[Next, Previous, First Child, Parent] - Next: 与当前轮廓处于同一层级的下一条轮廓,没有为-1。 - Previous: 与当前轮廓处于同一层级的上一条轮廓,没有为-1。 - Firtst Child: 当前轮廓的第一条子轮廓,没有为-1。 - Parent: 当前轮廓的父轮廓,没有为-1。

轮廓的四种寻找方式: - RETR_LIST:所有轮廓属于同一层级 - RETR_TREE: 完整建立轮廓的各属性 - RETR_EXTERNAL: 只寻找最高层级的轮廓 - RETR_CCOMP: 所有轮廓分2个层级,不是外界就是最里层

知识点3
轮廓的性质与特征
计算物体的周长、面积、质心、最小外接矩形等
OpenCV函数:cv2.contourArea(), cv2.arcLength(), cv2.approxPolyDP()

知识点4:
寻找等高线的时候,为何我推荐使用边缘检测而非阈值处理作为二值图?(具体见:https://zhuanlan.zhihu.com/p/38739563)
我参考的博客里面使用阈值函数cv2.threshold()处理图片得到二值图,不过我建议:在性能允许的情况下,当我们需要框出的是目标的轮廓,那么使用cv2.Canny() 更好,理由:

提取边缘与阈值处理不同,边缘提取可以识别图片中目标的形状、轮廓,而不是简单的区分出图片中的高光与暗调,可以简单地提图片中颜色分布位于中间调的上目标;
使用Canny边缘检测,提取结果的白点数量更少,对等高线检测的混淆因素减少(猜测);
我对比了一些边缘检测算法,Canny边缘检测效果好(虽然对性能要求高);

知识点5:
如果利用边沿检测(或二值图)—>轮廓—>掩码—>抠图
(见:OpenCV 中的轮廓应用中第二个应用,有python代码)
步骤:

  • 使用 Canny 边缘检测,得到二值图,然后对其进行膨胀和腐蚀操作,方便稍后提取轮廓
  • 先使用 cv2.findContours 获取所有轮廓,再根据轮廓面积进行降序排列,并获取到面积最大的轮廓,即图中人物的轮廓
  • 接下来通过 cv2.arcLength 得到轮廓周长,并将周长的0.1%作为近似轮廓的精度。然后再使用 cv2.approxPolyDP 得到近似轮廓。
  • 然后根据近似轮廓建立一个轮廓的掩码mask,在其上绘制出最大轮廓对应的填充多边形,用于下一步抠图
  • 对掩码进行高斯模糊用于平滑边缘,可以消除锯齿。
  • 最后一步就是将掩码和原图像进行求与运算,即得到最终结果。
  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值