如何在OpenCV Python中查找并绘制图像轮廓的凸包?
在计算机视觉领域,轮廓是一种表示物体形状的方法。凸包可以被看做是轮廓的一个简化版,它是一个包含所有轮廓点的最小凸多边形。
OpenCV是一个强大的计算机视觉库,提供了许多操作图像的工具。在本教程中,我们将介绍如何使用OpenCV Python库查找图像轮廓的凸包,并用示例代码演示它的应用。
1. 导入OpenCV库
在进行图像处理工作之前,需要导入OpenCV库。可以使用Python的pip包管理工具来安装OpenCV。
pip install opencv-python
然后,在Python脚本中导入库:
import cv2
import numpy as np
2. 读取图像
使用OpenCV读取图像非常简单。可以使用cv2.imread()函数读取一张图像。
img = cv2.imread('image.jpg')
3. 灰度化
为了能够找到图像的轮廓,需要将其转换为灰度图像。使用cv2.cvtColor()函数实现这一目标。
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
4. 二值化
一旦将图像转换为灰度图像,就需要将其转换为二值图像。将一些像素设为白色,另一些像素设为黑色。
使用cv2.threshold()函数可以完成图像二值化的工作。
ret,thresh = cv2.threshold(gray,127,255,0)
5. 查找轮廓
完成二值化之后,就可以使用cv2.findContours()函数来查找图像的轮廓。该函数返回两个值:图像的轮廓列表和层次结构。
contours,hierarchy = cv2.findContours(thresh, 1, 2)
6. 查找轮廓的凸包
找到图像的轮廓之后,就可以使用cv2.convexHull()函数来查找轮廓的凸包。然后,使用cv2.drawContours()函数将凸包绘制在原始图像上。
# 画出包含所有凸形点包括边界点的凸形多边形
hull = cv2.convexHull(cnt,returnPoints = False)
# 用绿色绘制凸多边形
for i in range(len(hull)):
cv2.line(img, tuple(hull[i][0]), tuple(hull[(i+1)%len(hull)][0]), (0, 255, 0), 3)
7.完整代码实例
import cv2
import numpy as np
# 读取图像
img = cv2.imread('image.jpg')
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化
ret,thresh = cv2.threshold(gray,127,255,0)
# 查找轮廓
contours,hierarchy = cv2.findContours(thresh, 1, 2)
# 绘制轮廓
cv2.drawContours(img, contours, -1, (0,255,0), 3)
# 查找轮廓的凸包
cnt = contours[0]
hull = cv2.convexHull(cnt,returnPoints = False)
# 绘制凸包
for i in range(len(hull)):
cv2.line(img, tuple(hull[i][0]), tuple(hull[(i+1)%len(hull)][0]), (0, 255, 0), 3)
# 显示图像
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
结论
在OpenCV Python中查找并绘制图像轮廓的凸包非常简单。首先将原始图像转换为灰度图像,然后将其转换为二值图像,接着使用cv2.findContours()函数查找图像轮廓,最后使用cv2.convexHull()函数查找轮廓的凸包。
本教程提供了一个完整的示例代码,可以帮助您更好地了解如何使用OpenCV Python查找并绘制图像轮廓的凸包。