美文网首页
HoughCircles(霍夫变换圆检测)

HoughCircles(霍夫变换圆检测)

作者: itfitness | 来源:发表于2019-08-16 10:47 被阅读0次

概念

HoughCircles函数

效果图对比

●源图像


ic_houghcircle.jpg

●处理后图像


函数讲解

●函数原型
○c++

void HoughCircles( InputArray image, OutputArray circles,
                               int method, double dp, double minDist,
                               double param1 = 100, double param2 = 100,
                               int minRadius = 0, int maxRadius = 0 )

○Android

void HoughCircles(Mat image, Mat circles, int method, double dp, double minDist, double param1, double param2, int minRadius, int maxRadius)

●参数解释
○image:输入图像:8-bit,灰度图
○circles:输出圆的结果。
○method:定义检测图像中圆的方法。目前唯一实现的方法是HOUGH_GRADIENT。
○dp:寻找圆弧圆心的累计分辨率,这个参数允许创建一个比输入图像分辨率低的累加器。(这样做是因为有理由认为图像中存在的圆会自然降低到与图像宽高相同数量的范畴)。如果dp设置为1,则分辨率是相同的;如果设置为更大的值(比如2),累加器的分辨率受此影响会变小(此情况下为一半)。dp的值不能比1小。
○minDist:该参数是让算法能明显区分的两个不同圆之间的最小距离。
○param1 :用于Canny的边缘阀值上限,下限被置为上限的一半。
○param2:HOUGH_GRADIENT方法的累加器阈值。阈值越小,检测到的圈子越多。
○minRadius :最小圆半径。
○maxRadius:最大圆半径。

注意

因为霍夫检测对噪声比较敏感,因此需要先对图像进行降噪处理,比如中值滤波。

函数使用

●c++中

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main() {
    Mat src = imread("C:/Users/Administrator/Desktop/ic_houghcircle.jpg");//引入源图像
    if (src.empty()) {
        return -1;
    }
    imshow("src", src);//显示源图像
    Mat mout;
    medianBlur(src,mout,7);//中值滤波降噪
    cvtColor(mout,mout,CV_BGR2GRAY);//转换为灰度图像
    vector<Vec3f> circles;//存储圆的容器
    HoughCircles(mout,circles,HOUGH_GRADIENT,1,10,100,30,5,25);//进行霍夫圆检测
    Scalar circleColor = Scalar(255,0,0);//圆形的边缘颜色
    Scalar centerColor = Scalar(0, 0, 255);//圆心的颜色
    for (int i = 0; i < circles.size(); i++) {
        Vec3f c = circles[i];
        circle(src, Point(c[0], c[1]),c[2], circleColor, 2, LINE_AA);//画边缘
        circle(src, Point(c[0], c[1]), 2, centerColor, 2, LINE_AA);//画圆心
    }
    imshow("dst", src);//显示处理后的图像
    waitKey(0);
    return 0;
}

●Android中

Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_relief);
Mat src = new Mat();
Mat blur = new Mat();
Utils.bitmapToMat(bitmap,src);//将Bitmap对象转换为Mat对象
Imgproc.medianBlur(src,blur,7);//中值滤波降噪
Mat circles = new Mat();//存储线的容器
Imgproc.HoughCircles(blur,circles,HOUGH_GRADIENT,1,10,100,30,5,25);//霍夫圆检测
for(int i = 0;i<circles.cols();i++){
     float[] circle = new float[3];
     circles.get(0,i,circle);//将圆对应的坐标存到circle数组中
     Imgproc.circle(src,new Point(circle[0],circle[1]), (int) circle[2],new Scalar(0,0,255),2,Imgproc.LINE_AA);//画边缘
     Imgproc.circle(src,new Point(circle[0],circle[1]), 2,new Scalar(255,0,0),2,Imgproc.LINE_AA);//画圆心
}
Utils.matToBitmap(src,bitmap);//将Mat对象转换为Bitmap对象

相关文章

  • HoughCircles(霍夫变换圆检测)

    概念 HoughCircles函数 效果图对比 ●源图像 ●处理后图像 函数讲解 ●函数原型○c++ ○Andro...

  • OpenCV-Python学习(十六):霍夫变换

    目录: 1.什么是霍夫变换? 2.OpenCV中的霍夫线变换-->直线检测 3.OpenCV中的霍夫圆变换-->圆...

  • 2019-06-03 OpenCV学习

    21直线检测 霍夫直线变换用来做直线检测,前提条件是边缘检测已完成。 22圆检测 霍夫圆变换原理: 从平面坐标到极...

  • 霍夫变换之直线检测

    霍夫变换 查看图像 结果: 边缘检测 结果: 霍夫变换检测直线 结果:

  • 021-Opencv笔记-霍夫圆变换

    霍夫圆变换原理 因为霍夫圆检测对噪声比较敏感,所以首先要对图像做中值滤波。基于效率考虑,Opencv中实现的霍夫变...

  • python skimage图像处理(三)

    本文转自 python数字图像处理 霍夫线变换 在图片处理中,霍夫变换主要是用来检测图片中的几何形状,包括直线、圆...

  • 霍夫变换

    霍夫变换——直线   Hough Line Transform用来做直线检测,前提是已经做了边缘检测。  霍夫变换...

  • 椭圆检测

    Hough变换检测椭圆 附带matlab与opencv代码 QT+opencv学习笔记(5)——霍夫直线检测、圆检...

  • 【OpenCV入门教程之十四】OpenCV霍夫变换:霍夫线变换,

    【OpenCV入门教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑文辑: https://blog.c...

  • 2.霍夫变换

    霍夫变换是检测直线或者圆的一种比较简单的方法。霍夫变换检测直线是比较简单的,做完以后是一个二维平面上的许多曲线,通...

网友评论

      本文标题:HoughCircles(霍夫变换圆检测)

      本文链接:https://www.haomeiwen.com/subject/lztvjctx.html