在OpenCV中轮廓处理
函数主要包括以下几个:
- 阈值化:将图像转换为二值图像,以便更容易地检测轮廓。
- 形态学操作:使用形态学操作(如开运算)来去除噪声。
- 边缘检测:使用Canny边缘检测算法来检测图像中的边缘。
- 查找轮廓:使用
cv2.findContours
函数来查找图像中的轮廓。 - 绘制轮廓:使用
cv2.drawContours
函数在图像上绘制轮廓。 - 轮廓近似:使用
cv2.approxPolyDP
函数来近似轮廓为多边形。 - 计算属性:计算轮廓的周长和面积,并在图像上显示这些信息。
下面是代码的详细解释:
import cv2# 读取图像
image = cv2.imread('path_to_image.jpg')# 将图像转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用阈值化方法进行二值化
_, binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)# 定义结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))# 开运算
opening = cv2.morphologyEx(binary_image, cv2.MORPH_OPEN, kernel)# 使用Canny边缘检测
edges = cv2.Canny(opening, 100, 200)# 查找轮廓
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 绘制轮廓
cv2.drawContours(image, contours, -1, (0, 255, 0), 2)# 遍历每个轮廓
for contour in contours:# 近似轮廓为多边形epsilon = 0.02 * cv2.arcLength(contour, True)approx = cv2.approxPolyDP(contour, epsilon, True)# 如果近似的多边形有四个顶点,则认为是四边形if len(approx) == 4:# 计算周长perimeter = cv2.arcLength(contour, True)# 计算面积area = cv2.contourArea(contour)# 在图像上显示周长和面积x, y, w, h = cv2.boundingRect(contour)cv2.putText(image, f': {perimeter:.2f}', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)# 显示图像
cv2.imshow('Contours', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
关键函数解释:
cv2.threshold
:将灰度图像转换为二值图像。cv2.getStructuringElement
:定义结构元素,用于形态学操作。cv2.morphologyEx
:进行形态学操作,如开运算。cv2.Canny
:进行Canny边缘检测。cv2.findContours
:查找图像中的轮廓。cv2.drawContours
:在图像上绘制轮廓。cv2.approxPolyDP
:近似轮廓为多边形。cv2.arcLength
:计算轮廓的周长。cv2.contourArea
:计算轮廓的面积。cv2.boundingRect
:计算轮廓的外接矩形。cv2.putText
:在图像上绘制文本。