Opencv-Python轮廓检测

轮廓检测

轮廓检测也是图像处理中经常用到的。OpenCV-Python接口中使用cv2.findContours()函数来查找检测物体的轮廓。

具体实现

  1. 读入灰度化图像
  2. 对图像二值化转换(按阈值转成0或255)
  3. 寻找轮廓
  4. 画出

具体实现:

#轮廓检测

import cv2

def cv_show(name,img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
img = cv2.imread("./shape_img.png")
img_gray = cv2.imread("./shape_img.png" , cv2.IMREAD_GRAYSCALE)

#阈值分割
#二值化效果不理想会使得轮廓不连续
ret , thresh_img = cv2.threshold(img_gray, 200, 255 , cv2.THRESH_BINARY)

#寻找轮廓
contours , hierarchy = cv2.findContours(thresh_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

draw_img = img.copy()
#绘制轮廓
#输入参数:绘制图像,轮廓,轮廓ID,颜色模式,线条宽度
res = cv2.drawContours(draw_img, contours, -1, (0 ,0 ,100) ,2)

cv_show('res', res)

原图像:
在这里插入图片描述
运行结果:
在这里插入图片描述

寻找轮廓

cv2.findContours()函数

contours , hierarchy = cv2.findContours(thresh_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

输入参数:

第一个参数是要寻找轮廓的图像;
第二个参数表示轮廓的检索模式,有四种:
cv2.RETR_EXTERNAL表示只检测外轮廓
cv2.RETR_LIST检测的轮廓不建立等级关系
cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
cv2.RETR_TREE建立一个等级树结构的轮廓。

第三个参数method为轮廓的近似办法
cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1
cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法

返回值

cv2.findContours()函数返回两个值,一个是轮廓本身:contour,还有一个是每条轮廓对应的属性:hierarchy。

contour存储轮廓各点坐标,tuple类型。

画出轮廓

cv2.drawContours()函数

#输入参数:绘制图像,轮廓,轮廓ID,颜色模式,线条宽度
res = cv2.drawContours(draw_img, contours, -1, (0 ,0 ,100) ,2)

输入参数:

第一个参数是要画轮廓的图像;
第二个参数为轮廓各点信息;
第三个参数为轮廓编号,-1表示全部,0、1、2……表示在轮廓列表中对应编号的轮廓;
第四个参数表示颜色;
第五个参数为线宽。

返回值

画好轮廓后的图片。

画单一轮廓时只出现了单一像素点

ret , thresh_img = cv2.threshold(img_gray, 127, 255 , cv2.THRESH_BINARY)

#寻找轮廓
contours , hierarchy = cv2.findContours(thresh_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

draw_img = img.copy()
#绘制轮廓
#输入参数:绘制图像,轮廓,轮廓ID,颜色模式,线条宽度
res = cv2.drawContours(draw_img, contours, 1, (0 ,0 ,100) ,2)

在这里插入图片描述
说明这时,图像二值化效果不佳,使得轮廓像素点断断续续的,更改阈值即可:

ret , thresh_img = cv2.threshold(img_gray, 200, 255 , cv2.THRESH_BINARY)

#寻找轮廓
contours , hierarchy = cv2.findContours(thresh_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

draw_img = img.copy()
#绘制轮廓
#输入参数:绘制图像,轮廓,轮廓ID,颜色模式,线条宽度
res = cv2.drawContours(draw_img, contours, 1, (0 ,0 ,100) ,2)

在这里插入图片描述

### OpenCV-Python 轮廓检测教程 轮廓检测计算机视觉领域的重要技术之一,广泛应用于对象检测、边缘检测以及形状分析等领域。以下是基于 OpenCV-Python轮廓检测示例代码及其说明。 #### 示例代码 以下是一个完整的 Python 代码示例,展示如何使用 `cv2.findContours()` 和 `cv2.drawContours()` 函数进行轮廓检测并将其绘制在图像上: ```python import cv2 import numpy as np # 加载原始图像 image = cv2.imread('example.jpg') # 将图像转换为灰度图 gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 使用高斯模糊减少噪声(可选) blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 0) # 应用 Canny 边缘检测算法生成二值化图像 edges = cv2.Canny(blurred_image, threshold1=30, threshold2=100) # 查找轮廓 contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 创建一个新的空白图像用于绘制轮廓 blank_image = np.zeros_like(image) # 绘制轮廓 cv2.drawContours(blank_image, contours, -1, (0, 255, 0), 2) # 显示结果 cv2.imshow('Original Image', image) cv2.imshow('Edges', edges) cv2.imshow('Detected Contours', blank_image) # 等待按键关闭窗口 cv2.waitKey(0) cv2.destroyAllWindows() ``` --- #### 代码解释 1. **加载图像**: 首先通过 `cv2.imread()` 方法加载输入图像。 2. **灰度转换**: 使用 `cv2.cvtColor()` 将彩色图像转换为灰度图像[^1]。 3. **降噪处理**: 可选地应用高斯滤波器 (`cv2.GaussianBlur`) 来平滑图像,从而降低噪声的影响。 4. **边缘检测**: 利用 Canny 边缘检测算法 (`cv2.Canny`) 获取二值化的边缘图像[^5]。 5. **查找轮廓**: 借助 `cv2.findContours` 函数提取图像中的轮廓信息[^4]。 6. **绘制轮廓**: 使用 `cv2.drawContours` 将找到的轮廓绘制到新创建的空白图像上[^2]。 7. **显示结果**: 最终通过 `cv2.imshow` 展示原图、边缘图和检测后的轮廓图。 --- #### 关键点解析 - **参数设置**: - `cv2.RETR_EXTERNAL`: 表示只检索最外层的轮廓- `cv2.CHAIN_APPROX_SIMPLE`: 对轮廓进行压缩,仅保留端点坐标。 - **颜色空间转换**: 如果需要将 BGR 图像转换为 RGB 格式以便于其他库(如 Matplotlib)使用,则可以通过 NumPy 实现快速的颜色通道反转:`img_RGB = img_BGRA[:, :, ::-1]`[^3]。 - **注意事项**: - 输入给 `cv2.findContours` 的图像必须是二值图形式,因此需提前完成灰度化与阈值分割操作。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值