1、OpencvSharp边缘检测 Cv2.Canny()
Canny()法最明显的创新,就是将单个的边缘候选像素加入轮廓。边缘检测的目的是在保留原有图像属性的情况下,显著减少图像的数据规模。有多种算法可以进行边缘检测,虽然Canny算法年代久远,但可以说它是边缘检测的一种标准算法。
private void Canny()
{
int hole = 0;
if (!int.TryParse(txtBoxCannyHole.Text, out hole))
{
return;
}
try
{
Cv2.Canny(src_img, dst, tkBarCannyMin.Value, tkBarCannyMax.Value, hole, rbBtnTrue.Checked);
//cannny。参数:1:src_img:8 bit 输入图像;2:dst输出边缘图像,一般是二值图像,背景是黑色;3:tkBarCannyMin.Value低阈值。值越大,找到的边缘越少;4:tkBarCannyMax.Value高阈值;5:hole表示应用Sobel算子的孔径大小,其有默认值3;6:rbBtnTrue.Checked计算图像梯度幅值的标识,有默认值false。
//低于阈值1的像素点会被认为不是边缘;
//高于阈值2的像素点会被认为是边缘;
//在阈值1和阈值2之间的像素点,若与一阶偏导算子计算梯度得到的边缘像素点相邻,则被认为是边缘,否则被认为不是边缘。
picBoxShowDel.Image = dst.ToBitmap();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
2、OpencvSharp直线检测 Cv2.HoughLinesP()圆检测Cv2.HoughCircles()
霍夫变换是一种特征检测(feature extraction),被广泛应用在图像分析(image analysis)、计算机视觉(computer vision)以及数位影像处理(digital image processing)。霍夫变换是用来辨别找出物件中的特征,例如:线条。他的算法流程大致如下,给定一个物件、要辨别的形状的种类,算法会在参数空间(parameter space)中执行投票来决定物体的形状,而这是由累加空间(accumulator space)里的局部最大值(local maximum)来决定。
霍夫变换-直线检测
private void HoughLinesP()
{
try
{
LineSegmentPoint[] lineSegmentPoint;
src_img.CopyTo(dst);
lineSegmentPoint = Cv2.HoughLinesP(dst, tkBarFBL.Value, Cv2.PI / 180, tkBarThreshold.Value, tkBarMinLength.Value, tkBarMaxGap.Value);
/*使用概率霍夫变换查找二进制图像中的线段。最终输出的是直线的两个点坐标,返回值类型:LineSegmentPoint[]
参数:1:dst输入图像,8位、单通道、二进制源图像。
2:tkBarFBL.Value累加器的距离分辨率(以像素为单位),(生成极坐标时的像素扫描的步长)
3 累加器的角度分辨率(以弧度为单位) (生成极坐标的角度步长,一般为 1°)
4:tkBarThreshold.Value阈值参数,只有获取足够交点的极坐标才能看作直线
5:tkBarMinLength.Value,最小线长度。比这短的线段将被拒绝。[默认值为0]
6 :tkBarMaxGap.Value同一条线上的点之间连接它们的最大允许间隙。[默认值为0] */
Mat ndst = new Mat();
reList[0].CopyTo(ndst);
for (int i = 0; i < lineSegmentPoint.Length; i++)
{
Cv2.Line(ndst, lineSegmentPoint[i].P1, lineSegmentPoint[i].P2, Scalar.Red, 6); //依据点集画线
}
picBoxShowDel.Image = ndst.ToBitmap();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
//霍夫变换之 圆检测
private void HoughCircle()
{
try
{
src_img.CopyTo(dst);
CircleSegment[] circleSegment;
circleSegment = Cv2.HoughCircles(dst, HoughModes.Gradient, tkBarDP.Value, tkBarMinDist.Value, tkBarParam1.Value, tkBarParam2.Value, tkBarMinRadius.Value, tkBarMaxRadius.Value);
//霍夫圆检测:使用霍夫变换查找灰度图像中的圆。
/*
* 参数:
* 1:输入参数:8位、单通道、灰度输入图像
* 2:实现方法
* 3: dp :累加器分辨率与图像分辨率的反比。默认=1
* 4:minDist: 检测到的圆的中心之间的最小距离。
* 5:param1: 第一个方法特定的参数。[默认值是100]canny边缘检测阈值低
* 6:param2: 第二个方法特定于参数。[默认值是100]中心点累加器阈值 – 候选圆心
* 7:minRadius: 最小半径
* 8:maxRadius: 最大半径 */
Mat ndst = new Mat();
reList[0].CopyTo(ndst);
for (int i = 0; i < circleSegment.Count(); i++)
{
//画圆、圆心
Cv2.Circle(ndst, (int)circleSegment[i].Center.X, (int)circleSegment[i].Center.Y, (int)circleSegment[i].Radius, Scalar.Red, 2, LineTypes.AntiAlias);
Cv2.Circle(ndst, (int)circleSegment[i].Center.X, (int)circleSegment[i].Center.Y, 3, Scalar.Red, 2, LineTypes.AntiAlias);
}
picBoxShowDel.Image = ndst.ToBitmap();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
源程序链接:https://download.csdn.net/download/xaiqpl/20097067