python 基于opencv 绘制图像轮廓

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()函数提取图像的轮廓,并进行绘制。这是基本图像处理的一项重要技能,值得学习和掌握。

后端开发标签