1. 前言
OpenCV是一个基于开源发行的跨平台计算机视觉库,旨在提高图像处理的计算速度和灵活性。在数字图像处理、计算机视觉领域中被广泛使用。本文介绍如何使用Python语言基于OpenCV绘制图像的轮廓,重点介绍了OpenCV中的轮廓函数cv2.findContours()的使用方法。
2. 如何获得OpenCV库
使用Python基于OpenCV进行图像处理之前,需要先安装OpenCV库。安装方法如下:
2.1 Windows平台
可以通过pip命令安装OpenCV-python。打开Windows的命令提示符或Anaconda Prompt,运行以下命令:
$ pip install opencv-python
2.2 macOS平台
可以用HomeBrew安装OpenCV-python,使用以下命令:
$ brew install opencv-python
2.3 Linux平台
可以使用以下命令安装OpenCV-python:
$ pip3 install opencv-python
3. 读取图片
使用OpenCV处理图像,首先需要读取图片。OpenCV提供了一个函数cv2.imread()用于读取图片。
import cv2
# 读取图片
img = cv2.imread('image.jpg')
# 显示图像
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
其中,img为一个numpy的多维数组,可以通过下列代码查看图片的形状和大小。
print(img.shape)
在显示图像时,可以通过cv2.waitKey()等待用户按下键盘,如果在等待期间没有按下键盘,则返回-1。cv2.destroyAllWindows()函数用于关闭所以窗口。
4. 灰度转换和二值化
在获取图片后,通常需要对图片进行一些预处理。首先,将彩色图像转换为灰度图像,然后进行二值化处理。此处使用的转换方式是:先使用cv2.cvtColor()将彩色图像转换为灰度图像,然后使用cv2.threshold()进行二值化处理。
import cv2
# 读取图片
img = cv2.imread('image.jpg')
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 显示图像
cv2.imshow('binary', binary)
cv2.waitKey(0)
cv2.destroyAllWindows()
其中,cv2.threshold()函数用于对灰度图像进行二值化处理。函数中,第二个参数为阈值,第三个参数为最大值。如果像素值大于阈值参数,则取最大值,否则参数设置为0。这里选择127为阈值值。通过cv2.threshold()函数处理后,返回的ret表示像素点的值,binary表示处理后的二值化图像。
5. 提取轮廓
在处理好的二值化图像中,有可能存在多个物体,或者单个物体内部有空洞,此时需要对图像提取轮廓。
OpenCV提供了一个函数cv2.findContours()用于提取轮廓。函数cv2.findContours()接收三个参数:输入图像、轮廓检索模式、轮廓近似方法。返回值为三个参数:输入图像、提取到的轮廓、轮廓的层次结构。
5.1 轮廓检索模式
轮廓检索模式有四种:
cv2.RETR_EXTERNAL: 只检测外部轮廓
cv2.RETR_LIST检测全部轮廓并将其保存在列表中
cv2.RETR_CCOMP: 检测所有轮廓,并将其保存在两个层次结构中
cv2.RETR_TREE: 检测所有轮廓,并重新构建层次结构。
5.2 轮廓近似方法
轮廓近似方法有三种:
cv2.CHAIN_APPROX_NONE:保存所有的边界点
cv2.CHAIN_APPROX_SIMPLE:压缩水平、垂直和所有对角线部分,仅保留起点和终点
cv2.CHAIN_APPROX_TC89_L1:使用TEH-CHIN链逼近算法来压缩
cv2.CHAIN_APPROX_TC89_KCOS:使用TEH-CHIN链逼近算法来压缩
下列代码使用了cv2.findContours()函数来提取图像的轮廓。
import cv2
# 读取图片
img = cv2.imread('image.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)
# 绘制轮廓
draw_img = cv2.drawContours(img, contours, -1, (0, 0, 255), 2)
# 显示图像
cv2.imshow('contours', draw_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
绘制轮廓时,cv2.drawContours()函数用于在图片上绘制轮廓,共有五个参数:绘制的图像、轮廓、轮廓索引、绘制颜色和线条宽度。
6. 总结
使用Python和OpenCV可以方便地对图像进行处理和分析。本文介绍了如何使用OpenCV库中的cv2.findContours()函数提取图像的轮廓,并进行绘制。这是基本图像处理的一项重要技能,值得学习和掌握。