在二值图像中查找轮廓,并返回轮廓列表和层次结构,cv2.findContours

import cv2
import numpy as np

#如果时灰度图读取的时候,将灰度转BGR
color_img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)

# 加载图像
img = cv2.imread("image.jpg")

# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 应用阈值处理创建二值图像
thresh = cv2.threshold(gray, cfg["thres_bus"][0], cfg["thres_bus"][1], cv2.THRESH_BINARY)[1]

# 查找二值图像中的轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 在原始图像上绘制轮廓
cv2.drawContours(img, contours, -1, (0, 255, 0), 2)


# 遍历轮廓并显示坐标
for contour in contours:
    for point in contour:
        x, y = point[0]
        print(f"点坐标: ({x}, {y})")



# 获取图像尺寸
height, width = img.shape[:2]

# 遍历外轮廓并显示相对坐标
for contour in contours:
    # 检查轮廓是否为外轮廓
    if hierarchy[0][contour][3] == -1:
        for point in contour:
            x, y = point[0]
            # 计算相对坐标
            relative_x = x / width
            relative_y = y / height
            print(f"点坐标: ({relative_x}, {relative_y})")


# 打印轮廓信息
for contour in contours:
    # 轮廓面积
    area = cv2.contourArea(contour)
    # 轮廓周长
    perimeter = cv2.arcLength(contour, True)
    # 轮廓近似
    approx = cv2.approxPolyDP(contour, 0.01 * perimeter, True)
    # 轮廓中心
    M = cv2.moments(contour)
    cX = int(M["m10"] / M["m00"])
    cY = int(M["m01"] / M["m00"])
    # 打印信息
    print(f"轮廓面积: {area}")
    print(f"轮廓周长: {perimeter}")
    print(f"轮廓近似: {approx}")
    print(f"轮廓中心: ({cX}, {cY})")
    print("--------------------")


# 显示带有轮廓的图像
cv2.imshow("带有轮廓的图像", img)
cv2.waitKey(0)

cv2.findContours函数参数解释

cv2.findContours函数参数解释

cv2.findContours(image, mode, method, contours, hierarchy[, offset])

该函数用于在二值图像中查找轮廓,并返回轮廓列表和层次结构。

参数:

    image: 输入图像,必须为单通道 8 位图像。
    mode: 轮廓检索模式,可取值为以下之一:
        cv2.RETR_EXTERNAL: 只检索最外层的轮廓。
        cv2.RETR_LIST: 检索所有轮廓,并将其保存在一个单一列表中。
        cv2.RETR_CCOMP: 检索所有轮廓,并将它们组织成两级层次结构。
        cv2.RETR_TREE: 检索所有轮廓,并将它们组织成完整的树形层次结构。
    method: 轮廓逼近方法,可取值为以下之一:
        cv2.CHAIN_APPROX_NONE: 存储所有轮廓点。
        cv2.CHAIN_APPROX_SIMPLE: 压缩水平、垂直和对角方向的元素,并只保留它们的端点。
        cv2.CHAIN_APPROX_TC89_L1: 使用 Teh-Chin 链逼近算法。
        cv2.CHAIN_APPROX_TC89_KCOS: 使用 Teh-Chin 链逼近算法,但使用 Kosinus 距离作为误差度量。
    contours: 轮廓输出列表。
    hierarchy: 轮廓层次结构输出列表。
    offset: 轮廓坐标的偏移量,默认值为 (0, 0)。

返回值:

    contours: 轮廓列表,每个轮廓都是一个点数组。
    hierarchy: 轮廓层次结构列表,每个元素都是一个四元组,表示父轮廓、第一个子轮廓、下一个兄弟轮廓和前一个兄弟轮廓的索引。

与 cv2.findContours 函数上下关联的函数

与 cv2.findContours 函数上下关联的函数

除了 cv2.findContours 函数,OpenCV 还提供了一些与其上下关联的函数,用于图像轮廓分析和处理。这些函数可以分为以下几类:

1. 轮廓查找函数:

    cv2.findContours:查找图像中的轮廓。
    cv2.CHAIN_APPROX_SIMPLE:用于简化轮廓,只保留拐点。
    cv2.CHAIN_APPROX_NONE:不简化轮廓,保留所有点。
    cv2.RETR_EXTERNAL:只检索最外层的轮廓。
    cv2.RETR_LIST:检索所有轮廓,包括嵌套的轮廓。
    cv2.RETR_TREE:检索所有轮廓,并建立一个层次结构。

2. 轮廓属性计算函数:

    cv2.contourArea:计算轮廓的面积。
    cv2.arcLength:计算轮廓的长度。
    cv2.boundingRect:计算轮廓的最小外接矩形。
    cv2.minAreaRect:计算轮廓的最小面积矩形。
    cv2.convexHull:计算轮廓的凸包。
    cv2.approxPolyDP:对轮廓进行多边形逼近。
    cv2.moments:计算轮廓的矩。

3. 轮廓绘制函数:

    cv2.drawContours:在图像上绘制轮廓。
    cv2.fillPoly:用颜色填充轮廓。
    cv2.polylines:绘制轮廓的折线。

4. 其他相关函数:

    cv2.matchShapes:比较两个轮廓的形状相似度。
    cv2.pointPolygonTest:判断一个点是否在轮廓内。
    cv2.findContours:查找图像中的轮廓。

这些函数可以组合使用,以完成各种图像轮廓分析和处理任务。例如,您可以使用 cv2.findContours 函数查找图像中的轮廓,然后使用 cv2.contourArea 函数计算每个轮廓的面积,最后使用 cv2.drawContours 函数在图像上绘制面积最大的轮廓。

凸多边形轮廓

轮廓是否为凸多边形包含哪些边形呢
总之,所有多边形都可以被认为是轮廓,只要它们满足多边形的定义。轮廓是否为凸多边形包含所有类型的多边形,包括凸多边形和凹多边形。

import cv2
import numpy as np

# 加载图像
img = cv2.imread("image.jpg")

# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 应用阈值处理创建二值图像
thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)[1]

# 查找二值图像中的轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 遍历每个轮廓,判断是否是凸包,如果是则在原图上绘制
for contour in contours:
    is_convex = cv2.isContourConvex(contour)
    if is_convex:
        # 计算轮廓的凸包
        hull = cv2.convexHull(contour)

        # 在原图上绘制凸包
        cv2.drawContours(img, [hull], 0, (0, 255, 0), 2)

# 显示结果图像
cv2.imshow("Result", img)
cv2.waitKey(0)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枭玉龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值