使用 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时,目标图像将与源图像具有相同的深度。
边缘检测应用
- 在保留图像结构的同时减少图像中不必要的信息。
- 提取图像的重要特征,如曲线、角和线。
- 识别对象、边界和分割。
- 在计算机视觉和识别中发挥重要作用