Java OpenCV-4.0.0 图像处理16 霍夫变换-圆形检测

Java OpenCV-4.0.0 图像处理16 霍夫变换-圆形检测

Java OpenCV-4.0.0 霍夫变换-圆形检测

因为霍夫圆检测对噪声比较敏感,所以首先要对图像做中值滤波。
基于效率考虑,Opencv中实现的霍夫变换圆检测是基于图像梯度的实现,分为两步:
1.检测边缘,发现可能的圆心。
2.基于第一步的基础上从候选圆心开始计算最佳半径大小。2. 基于第一步的基础上从候选圆心开始计算最佳半径大小。


/**
 * OpenCV-4.0.0 霍夫变换-圆形检测
 * @paraments:
 * @return: void
 * @date: 2019年1月18日 上午11:26:07
 */
public static void houghCircles() {
	Mat src=Imgcodecs.imread("C:\\Users\\Administrator\\Pictures\\test55.jpg");
	Mat gary=new Mat();
	Mat dst=new Mat();
	Mat lines=new Mat();
	//1.中值模糊(滤波-->平滑)
	Imgproc.medianBlur(src, dst, 1);
	//2.灰度图片
	Imgproc.cvtColor(dst, gary, Imgproc.COLOR_RGB2GRAY);
	//3.霍夫变换-圆形检测
	//Imgproc.HoughCircles(8位灰度图片,写入特征图片,检测方法,深度,区域,参数1,参数2,最小半径,最大半径)
	Imgproc.HoughCircles(gary, lines,Imgproc.HOUGH_GRADIENT, 1 , 100, 100 ,30, 5, 200);
	double[] date;
	for(int i=0,len=lines.rows();i<len;i++) {
		date=lines.get(i, 0).clone();
		Imgproc.circle(src, new Point((int)date[0],(int)date[1]), (int)date[2], new Scalar(0, 0, 0),2,Imgproc.LINE_AA);//园周
		Imgproc.circle(src, new Point((int)date[0],(int)date[1]), 2, new Scalar(255, 0, 0),2,Imgproc.LINE_AA);//圆形
	}
	HighGui.imshow("白蛇", src);
	HighGui.waitKey(0);
}

======》原图
Java OpenCV-4.0.0 图像处理16 霍夫变换-圆形检测
======》处理后图片
Java OpenCV-4.0.0 图像处理16 霍夫变换-圆形检测