轮廓发现

简介: 轮廓发现
import cv2 as cv
import numpy as np


def threshold_demo(image):
    # 去噪声+二值化
    dst = cv.GaussianBlur(image,(3, 3), 0)
    gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_OTSU | cv.THRESH_BINARY)
    cv.imshow("binary", binary)
    return binary


def canny_demo(image):
    t = 100
    canny_output = cv.Canny(image, t, t * 2)
    cv.imshow("canny_output", canny_output)
    return canny_output


src = cv.imread("yuan_test.png")
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)
binary = threshold_demo(src)
canny = canny_demo(src)

# 轮廓发现
out, contours, hierarchy = cv.findContours(canny, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
for c in range(len(contours)):
    cv.drawContours(src, contours, c, (0, 0, 255), 2, 8)

# 显示
cv.imshow("contours-demo", src)

cv.waitKey(0)
cv.destroyAllWindows()
  1. 定义阈值处理函数

    def threshold_demo(image):
        # 去噪声+二值化
        dst = cv.GaussianBlur(image, (3, 3), 0)
        gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)
        ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_OTSU | cv.THRESH_BINARY)
        cv.imshow("binary", binary)
        return binary
    

    这个函数接收一个图像作为输入,首先使用cv.GaussianBlur函数对图像进行高斯模糊,以去除噪声。然后,使用cv.cvtColor将模糊后的图像转换为灰度图像。接着,使用cv.threshold函数结合Otsu方法自动计算阈值,并将灰度图像转换为二值图像。最后,使用cv.imshow显示二值图像,并返回二值图像。

  2. 定义Canny边缘检测函数

    def canny_demo(image):
        t = 100
        canny_output = cv.Canny(image, t, t * 2)
        cv.imshow("canny_output", canny_output)
        return canny_output
    

    这个函数使用cv.Canny对输入图像进行Canny边缘检测,设置最小阈值t为100,最大阈值是最小阈值的两倍。Canny边缘检测是一种非常流行的边缘检测算法,能够提供良好的边缘检测效果。函数显示边缘检测结果,并返回Canny边缘检测后的图像。

  3. 读取源图像并显示

    src = cv.imread("yuan_test.png")
    cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
    cv.imshow("input", src)
    

    使用cv.imread读取名为"yuan_test.png"的图像文件,并将其存储在变量src中。创建一个名为"input"的窗口,并使用cv.WINDOW_AUTOSIZE参数设置窗口大小自适应图像大小。然后使用cv.imshow在"input"窗口中显示原始图像。

  4. 调用处理函数并保存结果

    binary = threshold_demo(src)
    canny = canny_demo(src)
    

    调用前面定义的threshold_democanny_demo函数,对源图像src进行处理,并将处理后的二值图像和Canny边缘检测图像分别保存在变量binarycanny中。

  5. 轮廓发现

    out, contours, hierarchy = cv.findContours(canny, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
    

    使用cv.findContours函数在Canny边缘检测后的图像中发现轮廓。cv.RETR_TREE参数表示检索所有轮廓及其层级关系,cv.CHAIN_APPROX_SIMPLE参数表示存储轮廓的近似形式,以节省内存。

  6. 绘制轮廓

    for c in range(len(contours)):
        cv.drawContours(src, contours, c, (0, 0, 255), 2, 8)
    

    遍历所有轮廓,使用cv.drawContours函数在原始图像src上绘制轮廓。每个轮廓使用蓝色(BGR值为(0, 0, 255))绘制,宽度为2,8表示绘制所有八连通的点。

  7. 显示轮廓结果

    cv.imshow("contours-demo", src)
    

    创建一个名为"contours-demo"的窗口,并使用cv.imshow显示绘制了轮廓的原始图像。

  8. 等待按键事件并关闭窗口

    cv.waitKey(0)
    cv.destroyAllWindows()
    
目录
相关文章
|
7月前
|
索引
绘制轮廓
【6月更文挑战第25天】绘制轮廓。
83 1
|
5月前
|
自然语言处理 并行计算 算法
基于均值坐标(Mean-Value Coordinates)的图像融合算法的具体实现
基于均值坐标(Mean-Value Coordinates)的图像融合算法的具体实现
56 0
|
7月前
|
Python
轮廓的矩
【6月更文挑战第25天】轮廓的矩。
56 1
|
7月前
|
索引 Python
轮廓的凸包
【6月更文挑战第11天】轮廓的凸包。
51 3
|
7月前
|
SDN Python
轮廓的近似多边形
【6月更文挑战第11天】轮廓的近似多边形。
59 4
|
7月前
|
Python
轮廓面积
【6月更文挑战第11天】轮廓面积。
53 3
|
8月前
|
算法 Serverless 计算机视觉
【OpenCV】- 多边形将轮廓包围
【OpenCV】- 多边形将轮廓包围
101 5
|
8月前
|
算法
[Halcon&拟合] 直线、矩形和圆的边缘提取
[Halcon&拟合] 直线、矩形和圆的边缘提取
489 0
|
数据安全/隐私保护 计算机视觉
opencv边缘检测加提取(圆形和矩形)
opencv边缘检测加提取(圆形和矩形)
79 0
|
存储 API 图形学
OpenCV_11 轮廓检测:图像的轮廓+绘制轮廓+轮廓近似+边界矩形+椭圆拟合+直线拟合
轮廓检测指检测图像中的对象边界,更偏向于关注上层语义对象。如OpenCV中的findContours()函数, 它会得到每一个轮廓并以点向量方式存储,除此也得到一个图像的拓扑信息,即一个轮廓的后一个轮廓、前一个轮廓等的索引编号。
1942 0

热门文章

最新文章