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);
}
======》原图
======》处理后图片