python学opencv|读取图像(六十四)使用cv2.findContours()函数+cv2.drawContours()函数实现图像轮廓识别和标注

【1】引言

前序使用形态函数对图像的轮廓凸显效果,和像素核有很明显的关系,相关文章链接为:

python学opencv|读取图像(六十二)使用cv2.morphologyEx()形态学函数实现图像梯度处理-CSDN博客

python学opencv|读取图像(六十三)使用cv2.morphologyEx()形态学函数实现图像顶帽处理-CSDN博客

在此基础上,如果进一步,尝试绘制出图像的边界轮廓,对图像识别的效果肯定会更进一步。

这就是本次文章的学习目标:先使用cv2.findContours()函数识别出图像的轮廓,然后使用cv2.drawContours()函数绘制出图像轮廓。

【2】官网教程

点击下方链接,直达cv2.findContours()函数官网教程:OpenCV: Structural Analysis and Shape Descriptors

官网页面对 cv2.findContours()函数的说明为:

图1 官网页面对 cv2.findContours()函数的说明

具体的,官网页面对cv2.findContours()函数的参数说明为:

void cv::findContours     (     

        InputArray     image,                                #输入图像
        OutputArrayOfArrays     contours,           #输入图像的边界轮廓-输出值
        OutputArray     hierarchy,                        #输入图像的层次关系-输出值
        int     mode,                                             #轮廓的检索模式
        int     method,            )                             #轮廓的检索方法

然后继续点击下述链接,直达cv2.drawContours()函数的官网教程:

OpenCV: Drawing Functions

官网页面对 cv2.drawContours()函数的说明为:

图2 官网页面对 cv2.drawContours()函数的说明

具体的,官网页面对cv2.drawContours()函数的参数说明为:

void cv::drawContours     (     

        InputOutputArray     image,                      #输入图像
        InputArrayOfArrays     contours,               #输入边界轮廓
        int     contourIdx,                                       #绘制轮廓的索引,当取-1时,绘制所有轮廓
        const Scalar &     color,                             #绘制轮廓的颜色
        int     thickness = 1,                                   #绘制轮廓的线宽
        int     lineType = LINE_8,                          #绘制轮廓的线型,可选参数
        InputArray     hierarchy = noArray(),         #绘制轮廓的层次,外部输入,可选参数
        int     maxLevel = INT_MAX,                    #绘制轮廓的层次深度,可选参数
       )

【3】代码测试

首先引入必要的模块和初始图像,将图像转化为灰度图:

import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块

# 读取图片
src = cv.imread('srcc.png') #读取图像srcx.png
gray=cv.cvtColor(src,cv.COLOR_BGR2GRAY) #将图像转化为灰度图

然后进行图像处理,为了增强图像处理的效果,提前使用了阈值处理:

#图像处理
t,dst=cv.threshold(gray,127,255,cv.THRESH_BINARY) #阈值处理
con,hierarchy=cv.findContours(dst,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_NONE) #读取边界
cv.drawContours(src,con,-1,(200,100,155),5) #绘制边界

为便于理解,阈值处理的文章链接为:

python学opencv|读取图像(三十三)阈值处理-灰度图像-CSDN博客

这里阈值处理的目的是,简化图像的BGR值,减少内存,便于后续处理。

然后显示图像效果:

# 显示结果
cv.imshow('ini-image ', dst) #显示原始图像
cv.imshow('ini-image-con', src) #显示带轮廓线图像
cv.imwrite('ini-image-con.png', dst)
cv.waitKey()  # 图像不关闭
cv.destroyAllWindows()  # 释放所有窗口

代码运行相关的图像有:

图3 初始图像srcc.png

图4 阈值处理后的灰度图像

图5  添加轮廓线后的图像

由图5可见,图像的轮廓线被明显识别和标注。

【4】细节说明

转化灰度图的目的是,便于cv2.findContours()函数进行轮廓线识别。

【5】总结

掌握了python+opencv通过使用cv2.findContours()函数+cv2.drawContours()函数实现图像轮廓识别和标注。

猜你喜欢

转载自blog.csdn.net/weixin_44855046/article/details/145599665