我是靠谱客的博主 开朗发卡,这篇文章主要介绍OpenCvSharp学习(二一):边缘检测,现在分享给大家,希望可以做个参考。

边缘检测可以提取图像的重要的轮廓信息,减少图像的内容,可以用于分个图像,做特征提取等等
边缘检测的一般步骤
1)滤波(过滤噪声对图像边缘的影响)
2)增强(利用形态学梯度,将图像的边缘凸显出来)
3)检测(阈值方法确定边缘)
常用的边缘检测算子
Canny
Sobel
Scharr
Laplacian
Robtrts
Prewitt

Canny算子:
函数原型

复制代码
1
2
public static void Canny(InputArray src, OutputArray edges, double threshold1, double threshold2, int apertureSize = 3, bool L2gradient = false);

src:输入图像
edges
threshold1:滞后阈值低阈值
threshold2:滞后阈值高阈值
一般高低阈值的比例在2:1到3:1之间
apertureSize: Sobel操作符的孔径大小[默认为aperturresizize . size3]
L2gradient :计算图像梯度幅值的标志

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
Mat src = new Mat(@"I:OpenCvSharp学习瓦力.jpg", ImreadModes.AnyColor); Window srcmat = new Window("srcmat",WindowMode.AutoSize,src); Mat Graymat = new Mat(); Cv2.CvtColor(src, Graymat, ColorConversionCodes.BGR2GRAY); Window _Graymat = new Window("_Graymat1", WindowMode.AutoSize, Graymat); // Mat element = Cv2.GetStructuringElement(MorphShapes.Rect,new Size(3,3),new Point(-1,-1)); // Cv2.MorphologyEx(Graymat, Graymat,MorphTypes.Open,element); //Cv2.MorphologyEx(Graymat, Graymat, MorphTypes.Gradient, element); Window _Graymat1 = new Window("MorphologyEx", WindowMode.AutoSize, Graymat); Cv2.Canny(Graymat, Graymat, 100, 300,3,false); Window _Graymat2 = new Window("Canny", WindowMode.AutoSize, Graymat); Cv2.WaitKey(0);

可用形态学操作将红色方框内的内容去除
在这里插入图片描述

在这里插入图片描述
Sobel算子
Sobel算子主要用来检测离散微分边缘算子,Sobel算子对噪声灰常敏感,一般需要先把图片进行高斯降噪

复制代码
1
2
3
public static void Sobel(InputArray src, OutputArray dst, MatType ddepth, int xorder, int yorder, int ksize = 3, double scale = 1, double delta = 0, BorderTypes borderType = BorderTypes.Reflect101);

src:输入图像
dst:输出图像
ddepth:输出图像深度
xorder:X方向的差分阶数
yorder:Y方向的差分阶数
ksize :表示Sobel核大小,只能为奇数
scale: 计算导数值时候的缩放因子,默认为1
delta :表示存入目标图前可选的delta值
borderType :边界模式,一般为默认

关于ddepth

输入的depth输出的depth
CV_8U-1/CV_16S/CV_32F/CV_64F
CV_16U/CV_16S-1/CV_32F/CV_64F
CV_32F-1/CV_32F/CV_64F
CV_64F-1/CV_64F
  1. 转为灰度图像 ,Cv2.CvtColor
  2. 高斯降噪 - 降噪声, Cv2.GaussianBlur
  3. 求X方向和Y 方向的梯度图像
  4. 根据公式得到最终图像(X梯度+Y梯度)
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Mat src = new Mat(@"I:OpenCvSharp学习3.jpg", ImreadModes.AnyColor); Window srcmat = new Window("srcmat", WindowMode.AutoSize, src); Mat GrayMat = new Mat(); Cv2.CvtColor(src, GrayMat, ColorConversionCodes.BGR2GRAY); Cv2.GaussianBlur(GrayMat,GrayMat,new Size(3,3),5);//高斯降噪 Window _GrayMat = new Window("GaussianBlur", WindowMode.AutoSize, GrayMat); Mat X = new Mat(); Mat Y = new Mat(); Mat Abs_X = new Mat(); Mat Abs_Y = new Mat(); Mat Result = new Mat(); Cv2.Sobel(GrayMat,X,MatType.CV_16S,1,0);//计算出x方向的梯度图像 Cv2.Sobel(GrayMat, Y, MatType.CV_16S, 0,1);//计算出Y轴方向的梯度图像 Cv2.ConvertScaleAbs(X, Abs_X, 1.0);//缩放,计算绝对值并将结果转换为8位。 Cv2.ConvertScaleAbs(Y, Abs_Y, 1.0);//缩放,计算绝对值并将结果转换为8位。 Window show_X = new Window("X",WindowMode.AutoSize, Abs_X); Window show_Y = new Window("Y", WindowMode.AutoSize, Abs_Y); Cv2.AddWeighted(Abs_X,0.5,Abs_Y,0.5,0,Result);//权重相加 Window _Result = new Window("Result", WindowMode.AutoSize, Result); Cv2.WaitKey(0);

在这里插入图片描述

在这里插入图片描述
能得到十分清晰的边缘图

Laplacian算子

函数原型

复制代码
1
2
public static void Laplacian(InputArray src, OutputArray dst, MatType ddepth, int ksize = 1, double scale = 1, double delta = 0, BorderTypes borderType = BorderTypes.Reflect101);

参数 说明
src 源图像
dst 输出图像,将具有与src相同的大小和相同数量的通道
ddepth 目标图像的所需深度 默认填 -1,与源图一致
ksize 用于计算二阶导数滤波器的孔径大小,卷积核大小,奇数
scale 计算的拉普拉斯值的可选缩放因子(默认情况下不应用缩放)
delta 可选的增量值,在将结果存储到dst之前添加到结果中
borderType 边缘处理方法

复制代码
1
2
3
4
5
6
7
8
9
10
Mat src = new Mat(@"I:OpenCvSharp学习瓦力.jpg", ImreadModes.AnyColor); Cv2.GaussianBlur(src, src, new Size(3, 3), 5);//高斯降噪 Window srcmat = new Window("srcmat", WindowMode.AutoSize, src); Mat GrayMat = new Mat(); Cv2.CvtColor(src, GrayMat, ColorConversionCodes.BGR2GRAY); Window _GrayMat = new Window("GaussianBlur", WindowMode.AutoSize, GrayMat); Cv2.Laplacian(GrayMat, GrayMat, MatType.CV_8U, 1); Window Laplacian = new Window("Laplacian", WindowMode.AutoSize, GrayMat); Cv2.WaitKey(0);

在这里插入图片描述

最后

以上就是开朗发卡最近收集整理的关于OpenCvSharp学习(二一):边缘检测的全部内容,更多相关OpenCvSharp学习(二一)内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部