版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。
教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客
教程C#版本请访问:EmguCV学习笔记 C# 目录-CSDN博客
笔者的博客网址:https://blog.csdn.net/uruseibest
教程配套文件及相关说明以及如何获得pdf教程和代码,请移步:EmguCV学习笔记
学习VB.Net知识,请移步: vb.net 教程 目录_vb中如何用datagridview-CSDN博客
学习C#知识,请移步:C# 教程 目录_c#教程目录-CSDN博客
6.1 边缘检测
Emgu.CV常用的边缘检测方法:
1. Canny边缘检测:Canny算法是一种经典的边缘检测算法,可以通过CvInvoke.Canny函数进行调用。该函数接受源图像、低阈值和高阈值作为参数,并返回一个二值图像,其中边缘被标记为白色。
2. Sobel边缘检测:Sobel算子是一种基于梯度的边缘检测算子,可以通过CvInvoke.Sobel函数进行调用。该函数接受源图像、输出图像的深度、x和y方向的导数阶数、卷积核大小和比例因子作为参数,并返回一个浮点型的输出图像,其中边缘的幅值较高。
3. Scharr边缘检测:Scharr算子是一种改进的Sobel算子,可以通过CvInvoke.Scharr函数进行调用。该函数的参数和返回值与Sobel函数相似,但Scharr算子的性能更好。
4. Laplacian边缘检测:Laplacian算子是一种二阶微分算子,可以通过CvInvoke.Laplacian函数进行调用。该函数接受源图像、输出图像的深度和卷积核大小作为参数,并返回一个浮点型的输出图像,其中边缘的幅值较高。
5. Roberts边缘检测:Roberts算子是一种基于差分的边缘检测算子,可以通过CvInvoke.Roberts函数进行调用。该函数接受源图像和输出图像作为参数,并返回一个浮点型的输出图像,其中边缘的幅值较高。
6. Prewitt边缘检测:Prewitt算子是一种基于差分的边缘检测算子,可以通过CvInvoke.Prewitt函数进行调用。该函数接受源图像和输出图像作为参数,并返回一个浮点型的输出图像,其中边缘的幅值较高。
在使用以上边缘检测方法时,需要根据具体的需求选择合适的算法和参数,以达到较好的边缘检测效果。
6.1.1 Soble
CvInvoke.Sobel方法用于执行Sobel边缘检测算法,以检测图像中的边缘。该方法声明如下:
Public Shared Sub Sobel(src As Emgu.CV.IInputArray, dst As Emgu.CV.IOutputArray, ddepth As Emgu.CV.CvEnum.DepthType, xorder As Integer, yorder As Integer, Optional kSize As Integer = 3, Optional scale As Double = 1, Optional delta As Double = 0, Optional borderType As Emgu.CV.CvEnum.BorderType = 4)
主要参数说明:
- ddepth:输出图像的深度类型。
- xorder:x方向的导数阶数,通常为0或1。
- yorder:y方向的导数阶数,通常为0或1。
- kSize:Sobel算子的大小,通常为3、5、7等。
- scale:导数计算结果的缩放因子。
- delta:导数计算结果的偏移量。
- borderType:边界模式,用于处理图像边界情况。
通过调整xorder和yorder的值,可以选择计算水平或垂直方向的边缘。kSize指定了Sobel算子的大小,较大的值可以检测到更粗的边缘,但可能会丢失一些细节。scale和delta参数用于调整结果图像的亮度和对比度。
【代码位置:frmChapter6】Button1_Click
'Sobel
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim m1 As New Mat("C:\learnEmgucv\lena.jpg", CvEnum.ImreadModes.AnyColor)
'彩色图像进行边缘检测
Dim result1 As New Mat
CvInvoke.Sobel(m1, result1, DepthType.Cv16S, 1, 0, 3)
ImageBox1.Image = result1
Dim result2 As New Mat
CvInvoke.Sobel(m1, result2, DepthType.Cv16S, 0, 1, 3)
ImageBox2.Image = result2
'灰度图像进行边缘检测
Dim mgray As New Mat
CvInvoke.CvtColor(m1, mgray, ColorConversion.Bgr2Gray)
Dim result3 As New Mat
CvInvoke.Sobel(mgray, result3, DepthType.Cv8U, 2, 0, 3)
ImageBox3.Image = result3
End Sub
运行后如下图所示:
图6-1 Sobel边缘检测
6.1.2 Laplacian
CvInvoke.Laplacian方法用于执行Laplace边缘检测算法,以检测图像中的边缘。该方法声明如下:
Public Shared Sub Laplacian(src As Emgu.CV.IInputArray, dst As Emgu.CV.IOutputArray, ddepth As Emgu.CV.CvEnum.DepthType, Optional ksize As Integer = 1, Optional scale As Double = 1, Optional delta As Double = 0, Optional borderType As Emgu.CV.CvEnum.BorderType = 4)
参数说明参看6.1.1节【Soble】。
【代码位置:frmChapter6】Button2_Click
'Laplacian
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim m1 As New Mat("C:\learnEmgucv\lena.jpg", CvEnum.ImreadModes.AnyColor)
'彩色图像进行边缘检测
Dim result1 As New Mat
CvInvoke.Laplacian(m1, result1, DepthType.Cv16S, 1, 1)
ImageBox1.Image = result1
Dim result2 As New Mat
CvInvoke.Laplacian(m1, result2, DepthType.Cv16S, 3)
ImageBox2.Image = result2
'灰度图像进行边缘检测
Dim mgray As New Mat
CvInvoke.CvtColor(m1, mgray, ColorConversion.Bgr2Gray)
Dim result3 As New Mat
CvInvoke.Laplacian(mgray, result3, DepthType.Cv8U, 3)
ImageBox3.Image = result3
End Sub
运行后如下图所示:
图6-2 Laplacian边缘检测
6.1.3 Canny
CvInvoke.Canny方法用于执行Canny边缘检测算法,以检测图像中的边缘。该方法常用的一个声明如下:
Public Shared Sub Canny(image As Emgu.CV.IInputArray, edges As Emgu.CV.IOutputArray, threshold1 As Double, threshold2 As Double, Optional apertureSize As Integer = 3, Optional l2Gradient As Boolean = False)
主要参数说明:
- edges:要输出的边缘图像,为单通道黑白图。
- threshold1:第一个阈值。
- threshold2:第二个阈值。
- apertureSize:Sobel算子的大小。常用的有3、5、7等。
- L2gradient:是否使用更精确的L2范数计算梯度大小。
Canny算法首先使用Sobel算子计算图像中的梯度,然后通过比较梯度与阈值的大小来确定边缘像素。threshold1和threshold2用于控制边缘像素的阈值,低于threshold1的像素将被认为是非边缘像素,高于threshold2的像素将被认为是边缘像素,介于两者之间的像素将根据其与阈值的关系进行进一步判断。apertureSize指定了Sobel算子的大小,较大的值可以检测到更粗的边缘,但可能会丢失一些细节。L2gradient参数用于选择是否使用更精确的L2范数计算梯度大小。
【代码位置:frmChapter6】Button3_Click
'Canny
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim m1 As New Mat("C:\learnEmgucv\lena.jpg", CvEnum.ImreadModes.AnyColor)
ImageBox1.Image = m1
Dim result1 As New Mat
CvInvoke.Canny(m1, result1, 100, 200, 3)
ImageBox2.Image = result1
'灰度图像进行边缘检测
Dim m2 As New Mat()
CvInvoke.CvtColor(m1, m2, ColorConversion.Bgr2Gray)
Dim result3 As New Mat
CvInvoke.GaussianBlur(m2, result3, New Drawing.Size(3, 3), 5)
CvInvoke.Canny(result3, result3, 100, 200, 3)
ImageBox3.Image = result3
End Sub
运行后如下图所示:
图6-3 Canny边缘检测