• 第二周opencv


    一、边缘检测算子

    边缘检测算子是用于检测图像中物体边界的工具。边缘通常表示图像中灰度值或颜色发生显著变化的地方。边缘检测有助于识别图像中的物体形状、轮廓和结构。这些算子通过分析图像的灰度或颜色梯度来确定图像中的边缘。

    梯度算子

    要得到一幅图像的梯度,则要求在图像的每个像素点位置处计算偏导数。 一阶微分算子能够检测图像中的亮度变化,因此在边缘位置通常有较大的梯度值。通过检测梯度的变化,可以找到图像中的边缘。
    在这里插入图片描述
    对应的卷积模板
    在这里插入图片描述

    1、Roberts 算子

    原理: 基于交叉差分的梯度算法,通过局部差分计算检测边缘线
    在这里插入图片描述

    通过局部差分计算检测边缘线条。常用来处理具有陡峭的低噪声图像,当图像边缘接近于正45度或负45度时,该算法处理效果更理想。其缺点是对边缘的定位不太准确,提取的边缘线条较粗。

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    
    image = cv2.imread("../images/1.png", cv2.IMREAD_GRAYSCALE)
    # 1.定义 Roberts 算子的卷积核
    roberts_x = np.array([[1, 0], [0, -1]], dtype=np.float32)
    roberts_y = np.array([[0, 1], [-1, 0]], dtype=np.float32)
    # 2.二维卷积操作
    # 使用 filter2D 函数应用 Roberts 算子卷积核
    gradient_x = cv2.filter2D(image, cv2.CV_64F, roberts_x)
    gradient_y = cv2.filter2D(image, cv2.CV_64F, roberts_y)
    
    # 3.计算梯度幅值
    gradient_magnitude = np.sqrt(gradient_x**2 + gradient_y**2)
    
    # 转换结果为8位图像
    gradient_magnitude = np.uint8(gradient_magnitude)
    
    # 显示原图、Roberts算子的结果和应用结果
    plt.subplot(1, 4, 1)
    plt.imshow(image, cmap='gray')
    plt.title("Original Image")
    plt.axis("off")
    
    plt.subplot(1, 4, 2)
    plt.imshow(gradient_x, cmap='gray')
    plt.title("Roberts X")
    plt.axis("off")
    
    plt.subplot(1, 4, 3)
    plt.imshow(gradient_y, cmap='gray')
    plt.title("Roberts Y")
    plt.axis("off")
    
    plt.subplot(1, 4, 4)
    plt.imshow(gradient_magnitude, cmap='gray')
    plt.title("Magnitude")
    plt.axis("off")
    
    plt.show()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    在这里插入图片描述

    2、Prewitt 算子

    Prewitt算子使用中心差分法计算梯度
    在这里插入图片描述
    相比Roberts 2×2 模板考虑更多的相邻像素,更好地捕捉到图像中的局部变化

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 读取图像
    img = cv2.imread("../images/1.png", cv2.IMREAD_GRAYSCALE)
    
    # 1.使用Prewitt算子
    kernelx = np.array([[1, 0, -1], [1, 0, -1], [1, 0, -1]], dtype=int)
    kernely = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]], dtype=int)
    # 2.卷积
    gradient_x = cv2.filter2D(img, cv2.CV_64F, kernelx)
    gradient_y = cv2.filter2D(img, cv2.CV_64F, kernely)
    # 3
    # 计算梯度幅值
    gradient_magnitude = np.sqrt(gradient_x**2 + gradient_y**2)
    
    # 转换结果为8位图像
    gradient_magnitude = np.uint8(gradient_magnitude)
    
    # 显示原图、水平梯度、垂直梯度、Prewitt算子的结果
    plt.subplot(141), plt.imshow(img, cmap='gray'), plt.title('Original Image'), plt.axis('off')
    plt.subplot(142), plt.imshow(gradient_x, cmap='gray'), plt.title('X'), plt.axis('off')
    plt.subplot(143), plt.imshow(gradient_y, cmap='gray'), plt.title('Y'), plt.axis('off')
    plt.subplot(144), plt.imshow(gradient_magnitude, cmap='gray'), plt.title('Prewitt Operator'), plt.axis('off')
    plt.show()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在这里插入图片描述

    3、Laplace

    拉普拉斯算子 Laplacian算子是基于二阶导数的边缘检测算子。二阶微分算子主要用于检测图像中的灰度变化的变化率,或者说是梯度的变化率。在边缘处,梯度的变化率最大,因此二阶微分算子会在边缘位置产生较大的响应。在这里插入图片描述在这里插入图片描述

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 读取图像
    img = cv2.imread('../images/1.png', cv2.IMREAD_GRAYSCALE)
    
    # 使用拉普拉斯算子
    laplacian = cv2.Laplacian(img, cv2.CV_64F)
    
    # 转换结果为8位图像
    laplacian = np.uint8(np.absolute(laplacian))
    
    # 显示原图和拉普拉斯算子的结果
    plt.subplot(121), plt.imshow(img, cmap='gray'), plt.title('Original Image'), plt.axis('off')
    plt.subplot(122), plt.imshow(laplacian, cmap='gray'), plt.title('Laplacian Operator'), plt.axis('off')
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    4、Canny算子

    Canny基本步骤:
    1.去噪:应用高斯滤波来平滑图像
    2.找图像的梯度,先将卷积模板分别作用x和y方向,再计算梯度幅值和方向(在这里插入图片描述

    3.非极大值抑制:保留梯度方向上的局部极大值,细化边缘
    4.确定边缘。使用双阈值算法确定最终的边缘信息
    在这里插入图片描述

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 读取图像
    image = cv2.imread('../images/1.png', cv2.IMREAD_GRAYSCALE)
    # 高斯滤波降噪
    gaussian = cv2.GaussianBlur(image, (5, 5), 0)
    # 使用Canny算子进行边缘检测
    edges = cv2.Canny(gaussian, 50, 150)  # 50和150是Canny算子的两个阈值,可调整
    
    # 显示原始图像和边缘检测结果
    plt.subplot(121), plt.imshow(image, cmap='gray')
    plt.title('Original Image'), plt.xticks([]), plt.yticks([])
    
    plt.subplot(122), plt.imshow(edges, cmap='gray')
    plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
    
    plt.show()
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    5、四种算子的比较

    在这里插入图片描述

    在这里插入图片描述

    二、角点检测

    在角上 不管你把它朝哪个方向移动,像素值都会发生很大变化。

    ## 1.

    1.Moravec

    在这里插入图片描述
    注:权重函数在这里插入图片描述当像素位置 (x,y) 位于滑动窗口内时,权重函数为1,否则为0。

    E(u,v)越大 越可能是角点

    2.harris

    在Moravec 基础上 泰勒展开
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    角点响应函数R在这里插入图片描述在这里插入图片描述在这里插入图片描述

    3.Shi-Tomasi

    Shi-Tomasi 角点检测改进了Harris角点检测算法的R响应函数,R响应函数更加简单高效。在这里插入图片描述

  • 相关阅读:
    【解决方案】Ubuntu设置Matlab桌面启动快捷方式
    C++基础之类二(六个成员函数、构造及析构)待完善
    惊心动魄一周记
    Qt 关于mouseTracking鼠标追踪和tabletTracking平板追踪的几点官方说明
    基于PaddlePaddle训练中文标点符号模型
    01-简单字符串题目
    基于react-markdown组件自定义一个Markdown显示器
    更换网络ip地址怎么设置
    AI取代人类,可以自动生成prompt了
    华媒舍:怎样成为谷歌竞价排名羸家?10个方法
  • 原文地址:https://blog.csdn.net/weixin_45988242/article/details/136350584