如何提取轮廓然后再填充 Python
引言
在图像处理和计算机视觉领域,提取图像轮廓是一个非常常见且重要的操作。轮廓提取可以用于目标检测、图像分割、形状识别等应用。本文将介绍如何使用Python中的OpenCV库来提取图像的轮廓,并演示如何填充提取的轮廓。
实际问题
假设我们有一张包含一个圆形和一个长方形的黑白图像,我们想要提取出这两个形状的轮廓,并将轮廓填充为指定的颜色。
解决方案
步骤1:导入库
首先,我们需要导入需要使用的库,包括cv2
和numpy
。
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