如何提取轮廓然后再填充 Python

引言

在图像处理和计算机视觉领域,提取图像轮廓是一个非常常见且重要的操作。轮廓提取可以用于目标检测、图像分割、形状识别等应用。本文将介绍如何使用Python中的OpenCV库来提取图像的轮廓,并演示如何填充提取的轮廓。

实际问题

假设我们有一张包含一个圆形和一个长方形的黑白图像,我们想要提取出这两个形状的轮廓,并将轮廓填充为指定的颜色。

解决方案

步骤1:导入库

首先,我们需要导入需要使用的库,包括cv2numpy

import cv2
import numpy as np

步骤2:读取图像

接下来,我们需要读取包含圆形和长方形的黑白图像。

image = cv2.imread('shapes.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

步骤3:二值化图像

为了提取轮廓,我们需要将图像转换为二值图像。可以使用阈值方法将灰度图像转换为二值图像。

ret, thresh = cv2.threshold(gray, 127, 255, 0)

步骤4:提取轮廓

使用cv2.findContours()函数来提取图像的轮廓。

contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

步骤5:绘制轮廓

使用cv2.drawContours()函数绘制提取的轮廓。

cv2.drawContours(image, contours, -1, (0,255,0), 3)

步骤6:填充轮廓

为了填充提取的轮廓,我们可以使用cv2.fillPoly()函数。首先,我们需要创建一个与图像相同大小的黑色画布。

mask = np.zeros_like(image)

接下来,使用cv2.fillPoly()函数填充轮廓。

cv2.fillPoly(mask, contours, (255,255,255))

步骤7:显示结果

最后,我们可以使用cv2.imshow()函数显示原始图像和处理后的图像。

cv2.imshow("Original Image", image)
cv2.imshow("Filled Image", mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

完整的代码如下所示:

import cv2
import numpy as np

# 读取图像
image = cv2.imread('shapes.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 二值化图像
ret, thresh = cv2.threshold(gray, 127, 255, 0)

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

# 绘制轮廓
cv2.drawContours(image, contours, -1, (0,255,0), 3)

# 填充轮廓
mask = np.zeros_like(image)
cv2.fillPoly(mask, contours, (255,255,255))

# 显示结果
cv2.imshow("Original Image", image)
cv2.imshow("Filled Image", mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

流程图

下面是提取轮廓并填充的流程图:

flowchart TD
    A[读取图像] --> B[二值化图像]
    B --> C[提取轮廓]
    C --> D[绘制轮廓]
    D --> E[填充轮廓]
    E --> F[显示结果]

甘特图

下面是提取轮廓并填充的甘特图:

gantt
    dateFormat  YYYY-MM-DD
    section 图像处理
    读取图像               :active, 2022-01-01, 1d
    二值化图像             :active, 2022-01-02, 1d