本文主要是介绍EmguCV学习笔记 C# 6.1 边缘检测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
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 static void Sobel(
IInputArray src,
IOutputArray dst,
DepthType ddepth,
int xorder,
int yorder,
int kSize = 3,
double scale = 1,
double delta = 0,
BorderType borderType = BorderType.Reflect101
)
主要参数说明:
- 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 void Button1_Click(object sender, EventArgs e)
{
Mat m1 = new Mat("C:\\learnEmgucv\\lena.jpg", ImreadModes.AnyColor);
//彩色图像进行边缘检测
Mat result1 = new Mat();
CvInvoke.Sobel(m1, result1, DepthType.Cv16S, 1, 0, 3);
ImageBox1.Image = result1;
Mat result2 = new Mat();
CvInvoke.Sobel(m1, result2, DepthType.Cv16S, 0, 1, 3);
ImageBox2.Image = result2;
//灰度图像进行边缘检测
Mat mgray = new Mat();
CvInvoke.CvtColor(m1, mgray, ColorConversion.Bgr2Gray);
Mat result3 = new Mat();
CvInvoke.Sobel(mgray, result3, DepthType.Cv8U, 2, 0, 3);
ImageBox3.Image = result3;
}
运行后如下图所示:
图6-1 Sobel边缘检测
6.1.2 Laplacian
CvInvoke.Laplacian方法用于执行Laplace边缘检测算法,以检测图像中的边缘。该方法声明如下:
public static void Laplacian(
IInputArray src,
IOutputArray dst,
DepthType ddepth,
int ksize = 1,
double scale = 1,
double delta = 0,
BorderType borderType = BorderType.Reflect101
)
参数说明参看6.1.1节【Soble】。
【代码位置:frmChapter6】Button2_Click
//Laplacian
private void Button2_Click(object sender, EventArgs e)
{
Mat m1 = new Mat("C:\\learnEmgucv\\lena.jpg", ImreadModes.AnyColor);
//彩色图像进行边缘检测
Mat result1 = new Mat();
CvInvoke.Laplacian(m1, result1, DepthType.Cv16S, 1, 1); //(m1, result1, DepthType.Cv16S, 1, 0, 3);
ImageBox1.Image = result1;
Mat result2 = new Mat();
CvInvoke.Laplacian(m1, result2, DepthType.Cv16S, 3);
ImageBox2.Image = result2;
//灰度图像进行边缘检测
Mat mgray = new Mat();
CvInvoke.CvtColor(m1, mgray, ColorConversion.Bgr2Gray);
Mat result3 = new Mat();
CvInvoke.Laplacian(mgray, result3, DepthType.Cv8U, 3);
ImageBox3.Image = result3;
}
运行后如下图所示:
图6-2 Laplacian边缘检测
6.1.3 Canny
CvInvoke.Canny方法用于执行Canny边缘检测算法,以检测图像中的边缘。该方法常用的一个声明如下:
public static void Canny(
IInputArray image,
IOutputArray edges,
double threshold1,
double threshold2,
int apertureSize = 3,
bool l2Gradient = 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 void Button3_Click(object sender, EventArgs e)
{
Mat m1 = new Mat("C:\\learnEmgucv\\lena.jpg", ImreadModes.AnyColor);
ImageBox1.Image = m1;
Mat result1 = new Mat();
CvInvoke.Canny(m1, result1, 100, 200, 3);
ImageBox2.Image = result1;
//灰度图像进行边缘检测
Mat m2 = new Mat();
CvInvoke.CvtColor(m1, m2, ColorConversion.Bgr2Gray);
Mat result3 = new Mat();
CvInvoke.GaussianBlur(m2, result3, new Size(3, 3), 5);
CvInvoke.Canny(result3, result3, 100, 200, 3);
ImageBox3.Image = result3;
}
运行后如下图所示:
图6-3 Canny边缘检测
这篇关于EmguCV学习笔记 C# 6.1 边缘检测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!