欢迎访问宙启技术站
智能推送

Python函数实现简单的轮廓提取

发布时间:2023-06-09 03:10:17

前言

在图像处理中,轮廓提取一直是一个非常重要的任务。轮廓可以被用来识别图像中的物体边缘,计算物体的面积、周长和中心点等信息,或者将其作为图像识别的前置处理步骤,提高识别精度。本文将会介绍如何使用Python编写简单的轮廓提取函数。

环境准备

为了编写轮廓提取函数,我们需要安装Python的图像处理库——OpenCV。可以使用以下命令安装:

pip install opencv-python

代码实现

1. 导入库

首先,我们需要导入需要使用的Python库:

import cv2
import numpy as np

其中,cv2库是OpenCV的Python接口库,用于图像处理;numpy库则是Python的数学库,用于矩阵计算和数组操作。

2. 读取图像

接下来,我们需要读取一张待处理的图像,并将其转换为灰度图像。以下是读取和灰度转换的代码:

# 读取图像,转换为灰度图像
image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

我们可以使用cv2.imread函数来读取一张图像,返回的是一个三维数组,表示图像的像素矩阵。然后,我们使用cv2.cvtColor函数将该图像转换为灰度图像,其返回值是一个二维数组,即图像的灰度矩阵。

3. 二值化处理

由于轮廓包含的是物体的边缘信息,因此我们需要将灰度图像进行二值化处理,将像素值转换为0或255,以便更好的区分物体与背景。以下是二值化处理的代码:

# 二值化处理
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

在这段代码中,我们使用cv2.threshold函数进行二值化处理。其参数含义如下:

- gray:输入的灰度图像矩阵;

- 127:用于分割像素值的阈值,小于该值的像素将被设置为0,大于该值的像素将被设置为255;

- 255:设定像素值的上限,大于该值的像素将被截断;

- cv2.THRESH_BINARY:枚举值,表示二值化处理的方法,其中BINARY为基本二值化方法,即将小于阈值的像素取值为0,大于阈值的像素取值为1。

返回值_表示阈值,此处我们并不需要用到,而binary则表示处理后的二值化图像矩阵。

4. 轮廓提取

我们已经得到了图像的二值化矩阵,接下来使用cv2.findContours函数提取轮廓信息。以下是轮廓提取的代码:

# 轮廓提取
contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

cv2.findContours函数可以返回输入图像的轮廓信息,其参数含义如下:

- binary:输入的二值化图像矩阵;

- cv2.RETR_EXTERNAL:表示只提取最外层轮廓,即物体边缘;

- cv2.CHAIN_APPROX_SIMPLE:表示使用简单的压缩方法来压缩轮廓数据,将轮廓中冗余的点舍去,以节省空间。

返回值包括两部分,分别是轮廓(contours)和层次结构(hierarchy)。轮廓即是提取出来的物体轮廓信息,是一个由点组成的二维数组;层次结构则是轮廓间的层次关系,其中包括每个轮廓的父子关系、内外包含关系等等,非常复杂。

以下是如何在原图像中绘制轮廓的代码:

cv2.drawContours(image, contours, -1, (0, 0, 255), 2)
cv2.imshow('Contours', image)

第一行代码使用cv2.drawContours函数在原图像中绘制提取出来的所有轮廓,其中参数含义如下:

- image:输入的原图像矩阵;

- contours:要绘制的轮廓信息,即cv2.findContours函数返回的轮廓数组;

- -1:表示要绘制所有轮廓;

- (0, 0, 255):表示绘制轮廓的颜色,本例中为红色;

- 2:表示绘制轮廓的线宽。

第二行代码使用cv2.imshow函数显示绘制好的图像,在窗口中显示出来。

完整代码

import cv2
import numpy as np

# 读取图像,转换为灰度图像
image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 二值化处理
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# 轮廓提取
contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 在原图中绘制轮廓
cv2.drawContours(image, contours, -1, (0, 0, 255), 2)

# 显示结果
cv2.imshow('Contours', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

总结

在本文中我们介绍了如何使用Python编写简单的轮廓提取函数,包括图像读取、灰度转换、二值化处理、轮廓提取和轮廓绘制等步骤。当然,图像处理是一门非常复杂的学科,除了基础的轮廓提取,还有很多更加高级的技术,如边缘检测、特征提取、图像分割等等,需要我们不断学习和实践。