opencv-python在原图上绘制分割结果(分割轮廓)

在原图上绘制分割轮廓

数据准备

一、两张图片
1.原始图片 image.png
2.分割图片 mask.png

image

mask

绘制过程

在使用opencv进行绘制时主要使用到以下两个函数:
1.findContours()现在函数只有两个返回值 参数说明
第二个参数

cv2.RETR_LIST检测的轮廓不建立等级关系
cv2.RETR_TREE建立一个等级树结构的轮廓
cv2…RETR_EXTERNAL表示只检测外轮廓
cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。

第三个参数

cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1
cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法

2.drawContours()参数说明
cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset ]]]]])

第一个参数是指明在哪幅图像上绘制轮廓;
第二个参数是轮廓本身,在Python中是一个list。
第三个参数指定绘制轮廓list中的哪条轮廓,如果是-1,则绘制其中的所有轮廓。后面的参数很简单。其中thickness表明轮廓线的宽度

绘制过程

绘制代码:

import cv2
img = cv2.imread('./image.png')
mask = cv2.imread('./mask.png')

mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(mask, 127, 255, 0)
contours, im = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) #第一个参数是轮廓
cv2.drawContours(image=img, contours=contours, contourIdx=-1, color=(0, 255, 0), thickness=1)

cv2.namedWindow('a')
cv2.imshow('a', img)
cv2.waitKey(0)

显示结果

实现结果

### 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、付费专栏及课程。

余额充值