【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()函数的官网教程:
官网页面对 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()函数实现图像轮廓识别和标注。