人工智能OpenCV计算机视觉技术

5.3cand可调节边缘检测

人工智能OpenCV计算机视觉技术_第1张图片

完整代码:

import cv2
import numpy as np


# 载入图像,并处理可能的读取错误
img_original = cv2.imread('./image/lena.jpg')
if img_original is None:
    print("无法读取图像文件")
    raise SystemExit

# 创建可调整大小的窗口
cv2.namedWindow('Canny', cv2.WINDOW_NORMAL)

# 用高斯平滑处理原图像降噪
img = cv2.GaussianBlur(img_original, (3, 3), 0)
img1 = cv2.GaussianBlur(img_original, (1, 1), 0)


# 定义回调函数(这里暂未使用,但保留了结构)
def nothing(x):
    pass


# 创建两个滑动条,分别控制threshold1,threshold2,并添加注释
cv2.createTrackbar('threshold1', 'Canny', 50, 400, nothing)
# threshold1滑动条用于控制Canny边缘检测的下限阈值
cv2.createTrackbar('threshold2', 'Canny', 100, 400, nothing)
# threshold2滑动条用于控制Canny边缘检测的上限阈值


while True:
    # 返回滑动条所在位置的值
    threshold1 = cv2.getTrackbarPos('threshold1', 'Canny')
    threshold2 = cv2.getTrackbarPos('threshold2', 'Canny')
    # 用Canny函数进行边缘检测,指定最大和最小阈值,其中apertureSize默认为3
    img_edges = cv2.Canny(img, threshold1, threshold2)

    # 显示图像,并调整窗口大小使界面更美观
    cv2.imshow('original', img_original)
    cv2.resizeWindow('original', 300, 300)
    cv2.imshow('GaussianBlur_3,3', img)
    cv2.resizeWindow('GaussianBlur_3,3', 300, 300)
    cv2.imshow('GaussianBlur_1,1', img1)
    cv2.resizeWindow('GaussianBlur_1,1', 300, 300)
    cv2.imshow('Canny', img_edges)
    cv2.resizeWindow('Canny', 300, 300)

    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break

cv2.destroyAllWindows()

一、高斯模糊

  • 高斯模糊是一种常用的图像平滑处理方法,其原理是使用高斯核(也称为高斯滤波器)对图像进行卷积操作。高斯核是一个二维的高斯函数分布矩阵,它的中心值最大,向边缘逐渐减小。在卷积过程中,每个像素的值会被其周围像素的值加权平均,权重由高斯核确定。
  • 对于 cv2.GaussianBlur(img_original, (3, 3), 0),使用了一个 3x3 的高斯核,(3, 3) 表示核的大小。标准差 sigmaX 被设置为 0,此时 OpenCV 会根据核的大小自动计算合适的标准差。这有助于减少图像中的噪声,因为噪声通常是高频分量,而高斯模糊可以抑制高频分量。
  • img1 = cv2.GaussianBlur(img_original, (1, 1), 0) 中的核大小为 (1, 1),由于核的大小非常小,它几乎不会对图像进行模糊处理。这里可能是为了与 (3, 3) 的模糊结果进行对比,以观察不同程度的模糊效果。

二、滑动条与 Canny 边缘检测

  • cv2.createTrackbar 函数用于创建用户可交互的滑动条。它的参数依次为:滑动条名称、所在窗口名称、初始值、最大值和回调函数。
  • 'threshold1' 和 'threshold2' 是两个滑动条的名称,它们都位于 'Canny' 窗口中。初始值分别为 50 和 100,最大值为 400。回调函数 nothing 在这个例子中没有实际操作,但可以用来处理滑动条位置变化时的逻辑(例如更新显示或执行其他操作)。

  • Canny 边缘检测
    • cv2.Canny 是 OpenCV 中实现 Canny 边缘检测算法的函数。它的参数包括:输入图像、下限阈值 threshold1 和上限阈值 threshold2
    • 算法原理
      • Canny 边缘检测是一种多阶段的边缘检测算法,包括以下几个步骤:
        1. 高斯模糊:首先对图像进行高斯模糊,以减少噪声,代码中使用 cv2.GaussianBlur 进行了预处理。
        2. 计算梯度:使用 Sobel 算子计算图像的梯度幅值和方向。
        3. 非极大值抑制:对梯度幅值进行非极大值抑制,只保留梯度方向上的局部最大值,使边缘更细。
        4. 双阈值处理:使用 threshold1 和 threshold2 进行双阈值处理,将梯度幅值划分为强边缘(高于 threshold2)、弱边缘(介于 threshold1 和 threshold2 之间)和非边缘(低于 threshold1)。
        5. 边缘连接:将强边缘连接成轮廓,弱边缘只有与强边缘相连时才会被保留。
    • 通过滑动条,用户可以动态调整 threshold1 和 threshold2 的值,实时观察不同阈值下的边缘检测结果。这对于找到最佳的边缘检测参数非常有用,因为不同的图像可能需要不同的阈值来获得理想的边缘效果。

你可能感兴趣的:(OpenCV基础全集,opencv,计算机视觉,人工智能)