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

常用的边缘检测算子
Canny
Sobel
Scharr
Laplacian
Robtrts
Prewitt

1,Canny算子:

函数原型

  1. public static void Canny(InputArray src,
  2. OutputArray edges,
  3. double threshold1,
  4. double threshold2,
  5. int apertureSize = 3,
  6. bool L2gradient = false);

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

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

可用形态学操作将红色方框内的内容去除
image.png
image.png

2,Sobel算子

Sobel算子主要用来检测离散微分边缘算子,Sobel算子对噪声灰常敏感,一般需要先把图片进行高斯降噪
,能得到十分清晰的边缘图

  1. public static void Sobel(InputArray src,
  2. OutputArray dst,
  3. MatType ddepth, i
  4. int xorder,
  5. int yorder,
  6. int ksize = 3,
  7. double scale = 1,
  8. double delta = 0,
  9. BorderTypes borderType = BorderTypes.Reflect101);

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

关于ddepth
image.png

  1. Mat src = new Mat(@"I:\OpenCvSharp学习\3.jpg", ImreadModes.AnyColor);
  2. Window srcmat = new Window("srcmat", WindowMode.AutoSize, src);
  3. Mat GrayMat = new Mat();
  4. Cv2.CvtColor(src, GrayMat, ColorConversionCodes.BGR2GRAY);
  5. Cv2.GaussianBlur(GrayMat,GrayMat,new Size(3,3),5);//高斯降噪
  6. Window _GrayMat = new Window("GaussianBlur", WindowMode.AutoSize, GrayMat);
  7. Mat X = new Mat();
  8. Mat Y = new Mat();
  9. Mat Abs_X = new Mat();
  10. Mat Abs_Y = new Mat();
  11. Mat Result = new Mat();
  12. Cv2.Sobel(GrayMat,X,MatType.CV_16S,1,0);//计算出x方向的梯度图像
  13. Cv2.Sobel(GrayMat, Y, MatType.CV_16S, 0,1);//计算出Y轴方向的梯度图像
  14. Cv2.ConvertScaleAbs(X, Abs_X, 1.0);//缩放,计算绝对值并将结果转换为8位。
  15. Cv2.ConvertScaleAbs(Y, Abs_Y, 1.0);//缩放,计算绝对值并将结果转换为8位。
  16. Window show_X = new Window("X",WindowMode.AutoSize, Abs_X);
  17. Window show_Y = new Window("Y", WindowMode.AutoSize, Abs_Y);
  18. Cv2.AddWeighted(Abs_X,0.5,Abs_Y,0.5,0,Result);//权重相加
  19. Window _Result = new Window("Result", WindowMode.AutoSize, Result);
  20. Cv2.WaitKey(0);

image.png
image.png

3,Laplacian算子

函数原型

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 边缘处理方法

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);

image.png