By songwenxiao, 30 June, 2026
Forums

【金山文档 | WPS云文档】 OpenCV轮廓提取方法 https://www.kdocs.cn/l/cuM3UaHPg2cj

为什么要做轮廓提取?

在图像处理任务中,无论是:果实形状分析(如香榧横切面)、工业缺陷检测、医学图像分割、目标识别,“轮廓(Contour)”都是最基础但最关键的一步。

在OpenCV中,轮廓本质上可以理解为:连接图像中相同灰度/二值区域的边界点集合

OpenCV的轮廓提取是在“二值图像”中寻找白色目标的边界

基本规则:

  • 前景(目标)= 白色(255)
  • 背景 = 黑色(0)

所以第一步永远是:图像预处理 → 二值化

完整流程①图像预处理

常见操作:灰度化,高斯滤波(去噪),对比度增强

作用是降低噪声,提高边缘稳定性

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)

②二值化处理

Otsu自动阈值

_, binary = cv2.threshold(blur, 0, 255,
                          cv2.THRESH_BINARY + cv2.THRESH_OTSU)

固定阈值

_, binary = cv2.threshold(blur, 127, 255, cv2.THRESH_BINARY)

把图像变成黑白结构图

③边缘/形态学优化

Canny边缘检测/形态学闭运算(填补断裂) 让轮廓更连续

kernel = np.ones((3,3), np.uint8)
binary = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)

④提取轮廓

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