一、边缘检测
提取边缘:根据灰度的差值来获取边缘
1、Canny算子
// 提取边缘
// 使用canny算子,阈值1和阈值2中的最小值用于边缘。
// 参数:输入图片,输出图片,阈值1,阈值2
//大于高阈值,强边缘点;小于高阈值高于低阈值,弱边缘点;小于低阈值,过滤。
//滞后边界跟踪:强边缘点被认为是真边缘点,弱边缘可能是真边缘也可能是噪声引起的假边缘点。只有当假边缘点连接到真边缘点时,保留假边缘点,否则去除。
CvInvoke.Canny(grayImage, cannyImg, 20, 40);
2、Soble算子
//提取边缘
//Sobel算子,参数:输入图片,输出图片,图像深度,x 方向上的几阶导数,y 方向上的几阶导数
CvInvoke.Sobel(grayImage, sobelImage, grayImage.Depth, 1, 0);
3、Laplacian算子
//提取边缘
//Laplacian算子 参数:输入图片,输出图片,图像深度,二阶导数滤波器的孔径大小,拉普拉斯值的可选比例因子,结果存储到之前添加到结果中的可选增量值
CvInvoke.Laplacian(grayImage, LaplacianImage, grayImage.Depth, 3, 1, 0);
4、三种算子的优缺点
//1、Canny 不容易受噪声干扰,使用两种不同的阈值能够检测到真正的弱边缘 容易把噪点误判为边界 常用
//2、Sobel 对灰度渐变和噪声较多的图像处理效果较好 精度不高 精度要求不高时常用
//3、Laplacian 无方向性,对任何走向的界线和线条进行锐化 对噪声特别敏感 一般图像用的较少
二、霍夫检测
1、霍夫圆检测
private void 霍夫圆检测ToolStripMenuItem_Click(object sender, EventArgs e)
{
Mat readImage = new Mat();
//为了简便、封装的获取图片方法
ClassStatic.readImage("7", ClassStatic.Jpg, ref readImage);
Mat grayImage = new Mat();
//转化为灰度
CvInvoke.CvtColor(readImage, grayImage, ColorConversion.Rgb2Gray);
Mat blurImage = new Mat();
//高斯滤波
CvInvoke.GaussianBlur(grayImage, blurImage, new Size(5, 5), 3);
//霍夫圆检测
//参数:输入图像,实现方法,dp,最小距离,参数1,参数2,最小圆半径,最大圆半径
//dp:累加器分辨率与图像分辨率的反比。例如,如果dp=1,累加器的分辨率与输入图像相同。如果dp=2,则蓄能器的宽度和高度为原来的一半。
//最小距离:检测到的圆的中心之间的最小距离。太小会多检,太大会漏检
//参数1:在CV_HOUGH_GRADIENT梯度的情况下,它是传递给Canny()边缘检测器的两个阈值中的较高阈值(较低的阈值是较小的两倍)。
//参数2:在CV_HOUGH_GRADIENT梯度的情况下,它是检测阶段圆心的累加器阈值。越小,可得到越多的圆。与较大累加器值相对应的圆将首先返回。
CircleF[] circles = CvInvoke.HoughCircles(blurImage, HoughModes.Gradient, 2, 20, 100, 180, 5)