百度网站优化排名,如何建立一个免费的网站,自己制作一个网站怎么制作,一流的营销型网站建设摘要#xff1a;本文详细介绍了 OpenCV 中用于查找图像轮廓的 cv2.findContours() 函数以及绘制轮廓的 cv2.drawContours() 函数的使用方法。涵盖 cv2.findContours() 各参数#xff08;如 mode 不同取值对应不同轮廓检索模式#xff09;及返回值的详细解析#xff0c;搭配…
摘要本文详细介绍了 OpenCV 中用于查找图像轮廓的 cv2.findContours() 函数以及绘制轮廓的 cv2.drawContours() 函数的使用方法。涵盖 cv2.findContours() 各参数如 mode 不同取值对应不同轮廓检索模式及返回值的详细解析搭配多幅示例图片与丰富代码示例展示不同模式下的效果差异同时展示了 cv2.drawContours() 的用法并通过案例讲解如何利用轮廓绘制功能获取前景对象助力读者全面掌握图像轮廓相关操作要点及应用场景。 如果您觉得我的文章对您有帮助可以点赞收藏关注持续学习更多与OpenCV相关的知识 OpenCV 图像轮廓查找与绘制全攻略从函数使用到实战应用详解 查找并绘制轮廓cv2.findContours()函数的使用返回值countours的属性参数mode与返回值hierarchy cv2.drawContours函数的使用利用轮廓绘制功能获取前景对象 致谢 查找并绘制轮廓
边缘检测能检测出边缘但是边缘不连续但不是一个整体。OpenCV提供了cv2.findContours()去查找图像轮廓cv2.drawContours()将轮廓绘制起来。
cv2.findContours()函数的使用
该函数的语法如下 image与被处理图像一致contours返回的轮廓 hierarchy 图像的拓普信息轮廓层次 cv2.findContoursimage原始图像mode轮廓检索模式method轮廓的近似方法 这里有一个补充当OpenCV版本的大于4.x返回值没有image 我通过画图板画了一个例子存储在和代码同一个文件夹下大家可以复制我的图片去作为练习,补充一个重要的前提OpenCV中都是从黑色背景中找白色对象对象是白的背景是黑的图片必须是灰度二值图像对于彩色图像要做好阈值处理 我将这张图片命名为countours.JPG这是我的文件夹我用的是 jupyter notebook 大家用pycharm的就把代码和图片放在同一个文件夹下就可以运行我的代码了
返回值countours的属性
他的类型是list
import numpy as np
import cv2
img cv2.imread(countours.JPG,cv2.IMREAD_GRAYSCALE)
countours , hierarchy cv2.findContours(img,mode cv2.RETR_EXTERNAL,method cv2.CHAIN_APPROX_NONE)
print(type(countours))每一条轮廓的shape与内容都用列表的方法访问 一定要注意 必须先用高斯滤波进行平滑处理去除噪声 再用二值化阈值处理才能计算出正确的轮廓
import numpy as np
import cv2
img cv2.imread(countours.JPG,cv2.IMREAD_GRAYSCALE)# 先用高斯滤波平滑处理
img cv2.GaussianBlur(img, (5, 5), 0)
# 再用阈值处理转化为二值图像
_,img cv2.threshold(img, 128, 255, cv2.THRESH_BINARY)
countours , hierarchy cv2.findContours(img,mode cv2.RETR_EXTERNAL,method cv2.CHAIN_APPROX_NONE)
print(len(countours))
for i in range(len(countours)):print(countours[i].shape)print(countours[i])通过代码找出来十条轮廓与我们手动标注的数量一致
参数mode与返回值hierarchy
我将这张图片命名为mode.JPG这是我的文件夹我用的是 jupyter notebook 大家用pycharm的就把代码和图片放在同一个文件夹下就可以运行我的代码了 不同的mode参数对应着不同的hierarchy分为四种 第一种cv2.RETR_EXTERNAL只检测外轮廓
import numpy as np
import cv2
img cv2.imread(mode.JPG,cv2.IMREAD_GRAYSCALE)# 先用高斯滤波平滑处理
img cv2.GaussianBlur(img, (5, 5), 0)
# 再用阈值处理转化为二值图像
_,img cv2.threshold(img, 128, 255, cv2.THRESH_BINARY)
countours , hierarchy cv2.findContours(img,mode cv2.RETR_EXTERNAL,method cv2.CHAIN_APPROX_NONE)
print(len(countours))
print(hierarchy)
输出值[1 -1 -1 -1]代表 第0个轮廓的后一个轮廓是第一个轮廓他没有前一个轮廓 所以第二个元素是-1 他没有子轮廓 和父轮廓 所以第三第四个元素都是 - 1 输出值[-1 0 -1 -1]代表第1个轮廓 没有后面轮廓了 所以是-1 他的前一个轮廓 是0他没有子轮廓和父轮廓 所以第三个第四个元素都是 -1 找到了两条轮廓原因是cv2.RETR_EXTERNAL会导致只搜索外轮廓 第二种cv2.RETR_LIST 检测到的轮廓不考虑父子关系 在上面的代码中修改mode cv2.RETR_LIST运行结果如下 这个结果前两行的第一个元素都是 1 2 说明他们有后一个轮廓 因为没有考虑父子关系所以每一行的三四元素都是-1 第1 第2 轮廓都有前一个轮廓 分别是 0 和1 所以第二列 是 -1 0 1 第三种cv2.RETR_CCOMP 检查所有轮廓并组织称一个两级层次结构,修改参数mode cv2.RETR_CCOMP继续运行得到如下结果 可以看到第1 轮廓 和 第2 轮廓存在了 父子 关系 对于1,2轮廓来说他们是父子关系所以不存在后一个轮廓所以是-1 第四种cv2.RETR_TREE 生成一个等级树为了验证第四个和第三个的区别我重新用画图板画了一张图起名为tree.JPG大家可以复制到自己的文件夹下
import numpy as np
import cv2
img cv2.imread(tree.JPG,cv2.IMREAD_GRAYSCALE)
# 先用高斯滤波平滑处理
img cv2.GaussianBlur(img, (5, 5), 0)
# 再用阈值处理转化为二值图像
_,img cv2.threshold(img, 128, 255, cv2.THRESH_BINARY)
countours_comp , hierarchy_comp cv2.findContours(img,mode cv2.RETR_CCOMP,method cv2.CHAIN_APPROX_NONE)
countours_tree , hierarchy_tree cv2.findContours(img,mode cv2.RETR_TREE,method cv2.CHAIN_APPROX_NONE)
print(hierarchy_comp)
print(hierarchy_tree)
详细分析一下运行结果 显而易见的是 cv2.RETR_CCOMP时最多产生一个两级的父子结构 但是cv2.RETR_TREE产生了一个多级的父子结构树
cv2.drawContours函数的使用
语法: cou_image待绘制的轮廓图像 cv2.drawCountoursimage待处理图像countours需要绘制的轮廓 list类型,countourIdx绘制的边缘索引color绘制的颜色thickness绘制轮廓的粗细lineType画笔类型hierarchy拓普信息maxLevel层次的深度offset偏移参数使得轮廓偏移多少位置 使用tree.JPG做案例来用代码验证一下效果
import numpy as np
import cv2
img cv2.imread(tree.JPG,cv2.IMREAD_GRAYSCALE)
# 先用高斯滤波平滑处理
img cv2.GaussianBlur(img, (5, 5), 0)
# 再用阈值处理转化为二值图像
_,img cv2.threshold(img, 128, 255, cv2.THRESH_BINARY)
countours_tree , hierarchy_tree cv2.findContours(img,mode cv2.RETR_TREE,method cv2.CHAIN_APPROX_NONE)n len(countours_tree)
contourImg []
cv2.imshow(orig,img)
for i in range(n):temp np.zeros(img.shape,np.uint8)contourImg.append(temp)contourImg[i] cv2.drawContours(contourImg[i],countours_tree,i,(255,255,255),5)cv2.imshow(fcontour[ {i}],contourImg[i])
cv2.waitKey()
cv2.destroyAllWindows() 利用轮廓绘制功能获取前景对象
这部分的案例使用pig.JPG图片需要的可以直接复制跟代码放在同一文件夹之下 先讲解一下代码的思路首先转化成灰度值和二值图像然后获取轮廓绘制整个轮廓利用按位与运算与原图像进行按位与运算提取前景对象。
import numpy as np
import cv2
bgr_img cv2.imread(pig.JPG)
img cv2.cvtColor(bgr_img,cv2.COLOR_BGR2GRAY)
# 先用高斯滤波平滑处理
img cv2.GaussianBlur(img, (5, 5), 0)
# 再用阈值处理转化为二值图像
_,img cv2.threshold(img, 128, 255, cv2.THRESH_BINARY)
countours_tree , hierarchy_tree cv2.findContours(img,mode cv2.RETR_TREE,method cv2.CHAIN_APPROX_NONE)
mask np.zeros(bgr_img.shape,np.uint8)
mask cv2.drawContours(mask,countours_tree,-1,(255,255,255),-1)
loc cv2.bitwise_and(mask,bgr_img)
cv2.imshow(mask,mask)
cv2.imshow(loc,loc)
cv2.waitKey()
cv2.destroyAllWindows()致谢
本文参考了一些博主的文章博取了他们的长处也结合了我的一些经验对他们表达诚挚的感谢使我对 图像轮廓查找与绘制 有更深入的了解也推荐大家去阅读一下他们的文章。纸上学来终觉浅明知此事要躬行 pythonopencv基础篇——实现提取轮廓