📜  使用 OpenCV 检测图像边缘的Python程序Sobel边缘检测方法

📅  最后修改于: 2022-05-13 01:55:17.637000             🧑  作者: Mango

使用 OpenCV 检测图像边缘的Python程序Sobel边缘检测方法

以下程序检测直播视频内容中的帧边缘。代码只能在linux环境下编译。在运行程序之前,请确保在您的系统中安装了 openCV。
下载要求的步骤如下:

  • 在您的终端上运行以下命令以从 Ubuntu 或 Debian 存储库安装它。
sudo apt-get install libopencv-dev python-opencv
  • 或者为了从官方站点下载 OpenCV,运行以下命令:
bash install-opencv.sh
  • 在您的终端上。
  • 输入您的 sudo 密码,您将安装 OpenCV。

边缘检测背后的原理

边缘检测涉及数学方法来查找图像中像素强度的亮度明显变化的点。

  • 我们要做的第一件事是找到灰度图像的梯度,使我们能够在 x 和 y 方向上找到类似边缘的区域。梯度是导数的多变量推广。虽然可以在单个变量的函数上定义导数,但对于多个变量的函数,梯度会代替它。
  • 梯度是向量值函数,与导数相反,导数是标量值。与导数一样,梯度表示函数图形的切线的斜率。更准确地说,梯度指向函数最大增长率的方向,其大小是该方向上图形的斜率。

注意:在计算机视觉中,从黑色到白色的过渡被认为是一个正斜率,而从白色到黑色的过渡是一个负斜率。

Python
# Python program to  Edge detection
# using OpenCV in Python
# using Sobel edge detection
# and laplacian method
import cv2
import numpy as np
 
#Capture livestream video content from camera 0
cap = cv2.VideoCapture(0)
 
while(1):
 
    # Take each frame
    _, frame = cap.read()
     
    # Convert to HSV for simpler calculations
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
     
    # Calculation of Sobelx
    sobelx = cv2.Sobel(frame,cv2.CV_64F,1,0,ksize=5)
     
    # Calculation of Sobely
    sobely = cv2.Sobel(frame,cv2.CV_64F,0,1,ksize=5)
     
    # Calculation of Laplacian
    laplacian = cv2.Laplacian(frame,cv2.CV_64F)
     
    cv2.imshow('sobelx',sobelx)
    cv2.imshow('sobely',sobely)
    cv2.imshow('laplacian',laplacian)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break
 
cv2.destroyAllWindows()
 
#release the frame
cap.release()


计算图像的导数

数字图像由一个矩阵表示,该矩阵在行和列中存储每个像素的 RGB/BGR/HSV(图像所属的颜色空间)值。
矩阵的导数由称为拉普拉斯算子的运算符子计算。为了计算拉普拉斯算子,您需要计算前两个导数,称为Sobel的导数,每个导数都考虑了某个方向上的梯度变化:一个水平方向,另一个垂直方向。

  • 水平索贝尔导数(Sobel x) :通过图像与称为核的矩阵的卷积获得,该矩阵始终具有奇数大小。大小为 3 的内核是最简单的情况。
  • 垂直索贝尔导数(Sobel y) :它是通过图像与称为内核的矩阵的卷积获得的,该矩阵始终具有奇数大小。大小为 3 的内核是最简单的情况。
  • 卷积的计算方法如下:Image表示原始图像矩阵,filter是核矩阵。

用内核卷积图像

  • 因数= 11 – 2- 2- 2- 2- 2 = 3
    偏移量= 0
    加权和= 124*0 + 19*(-2) + 110*(-2) + 53*11 + 44*(-2) + 19*0 + 60*(-2) + 100*0 = 117
    O[4,2] = (117/3) + 0 = 39
    所以最后要得到拉普拉斯算子(近似值),我们需要结合之前的两个结果(Sobelx 和 Sobely)并将其存储在拉普拉斯算子中。

参数:

  • cv2.Sobel():函数cv2.Sobel(frame,cv2.CV_64F,1,0,ksize=5)可以写成
cv2.Sobel(original_image,ddepth,xorder,yorder,kernelsize)
  • 其中第一个参数是原始图像,第二个参数是目标图像的深度。当 ddepth=-1/CV_64F 时,目标图像将与源图像具有相同的深度。第三个参数是导数 x 的阶数。第四个参数是导数 y 的阶数。在计算 Sobelx 时,我们将 xorder 设置为 1,将 yorder 设置为 0,而在计算 Sobely 时,情况将相反。最后一个参数是扩展 Sobel 核的大小;它必须是 1、3、5 或 7。
  • cv2.Laplacian : 在函数中
cv2.Laplacian(frame,cv2.CV_64F)
  • 第一个参数是原始图像,第二个参数是目标图像的深度。当depth=-1/CV_64F时,目标图像将与源图像具有相同的深度。

边缘检测应用

  • 在保留图像结构的同时减少图像中不必要的信息。
  • 提取图像的重要特征,如曲线、角和线。
  • 识别对象、边界和分割。
  • 在计算机视觉和识别中发挥重要作用