轮廓发现

简介: 轮廓发现
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()
    
目录
相关文章
|
3月前
|
索引
绘制轮廓
【6月更文挑战第25天】绘制轮廓。
38 1
|
4月前
|
计算机视觉 Python
透视变换
【5月更文挑战第15天】透视变换。
36 1
|
3月前
|
Python
轮廓的矩
【6月更文挑战第25天】轮廓的矩。
28 1
|
3月前
|
索引 Python
轮廓的凸包
【6月更文挑战第11天】轮廓的凸包。
24 3
|
3月前
|
SDN Python
轮廓的近似多边形
【6月更文挑战第11天】轮廓的近似多边形。
30 4
|
3月前
|
Python
轮廓面积
【6月更文挑战第11天】轮廓面积。
28 3
|
4月前
|
算法 Serverless 计算机视觉
【OpenCV】- 多边形将轮廓包围
【OpenCV】- 多边形将轮廓包围
|
4月前
|
算法
[Halcon&拟合] 直线、矩形和圆的边缘提取
[Halcon&拟合] 直线、矩形和圆的边缘提取
331 0
|
存储 API 图形学
OpenCV_11 轮廓检测:图像的轮廓+绘制轮廓+轮廓近似+边界矩形+椭圆拟合+直线拟合
轮廓检测指检测图像中的对象边界,更偏向于关注上层语义对象。如OpenCV中的findContours()函数, 它会得到每一个轮廓并以点向量方式存储,除此也得到一个图像的拓扑信息,即一个轮廓的后一个轮廓、前一个轮廓等的索引编号。
1511 0
|
计算机视觉
五、OpenCV绘制线、矩形、圆等基本几何形状
通过javaOpenCV中的Imgproc函数进行简单几何图形的绘制
123 0
五、OpenCV绘制线、矩形、圆等基本几何形状