計算機視覺 OpenCV Android | 基本特徵檢測之 霍夫圓檢

mug發表於2021-09-09
  • 霍夫圓變換霍夫直線變換原理類似,也是將圓上的每個點轉換到霍夫空間



  • 其轉換的引數方程如下:

    圖片描述

  • 對於圓來說,θ的取值範圍在0~360°,這樣就有了三個引數
    另外兩個引數圓心(x0,y0)半徑γ

  • 這裡的霍夫空間便是一個三維空間
    所以如果還是跟之前的累積計算一樣,計算量就會大大增加
    這樣顯然不利於快速計算與檢測

  • 所以在OpenCV中,
    霍夫圓檢測不是基於二值影像或者邊緣檢測的結果
    而是基於灰度影像的梯度來找到候選區域
    然後基於候選區域實現霍夫圓檢測
    這樣就會大大減少計算量,提高程式的執行速度與效能

    但是基於梯度實現霍夫圓檢測也帶來了另外一個問題,那就是結果特別容易受到噪聲影響,
    對影像中的噪聲特別敏感

    所以在OpenCV中使用相關API實現霍夫圓檢測的時候
    首先需要透過模糊操作對影像進行噪聲抑制處理
    一般來說,常見的均值、高斯、中值模糊影像噪聲的抑制已經比較有效
    但是在霍夫圓檢測中有時候還會用到邊緣保留濾波抑制平坦區域噪聲
    以便在進行梯度計算的時候能夠更好地得到候選區域

霍夫圓檢測的API:

  • HoughCircles(Mat image, Mat circles, int method, double dp, double minDist, double param1, double param2, int minRadius, int maxRadius)
    image:8位單通道的灰度影像。
    circles:輸出的三個向量的陣列,圓心與半徑(x,y,r)。
    method:唯一支援的方法就是基於梯度霍夫變換——HOUGH_GRADIENT。
    dp:影像解析度,注意dp越大,影像就會相應減小解析度;當dp等於1時,其跟原圖的大小一致;當dp=2時,其為原圖的一半。
    minDist:表示區分兩個圓的圓心之間最小的距離,如果兩個圓之間的距離小於給定的minDist,則認為是同一個圓,這個引數對霍夫圓檢測來說非常有用,可以幫助降低噪聲影響。
    param1:邊緣檢測Canny演算法中使用的高閾值。
    param2:累加器閾值,值越大,說明越有可能是圓。
    minRadius:檢測的最小圓半徑,單位為畫素。
    maxRadius:檢測的最大圓半徑,單位為畫素。

使用API實現灰度影像圓檢測:

private void houghCircleDemo(Mat src, Mat dst) {
  Mat gray = new Mat();
  Imgproc.pyrMeanShiftFiltering(src, gray, 15, 80);
  Imgproc.cvtColor(gray, gray, Imgproc.COLOR_BGR2GRAY);
  Imgproc.GaussianBlur(gray, gray, new Size(3, 3), 0);
  // detect circles  Mat circles = new Mat();
  dst.create(src.size(), src.type());
  Imgproc.HoughCircles(gray, circles, Imgproc.HOUGH_GRADIENT, 1, 20, 100, 30, 10, 200);
  for(int i=0; i<circles.cols(); i++) {
    float[] info = new float[3];
    circles.get(0, i, info);
    Imgproc.circle(dst, new Point((int)info[0], (int)info[1]), (int)info[2],
        new Scalar(0, 255, 0), 2, 8, 0);
  }
  circles.release();
  gray.release();
}



執行結果如下圖,左側為原圖,右側是霍夫圓檢測執行結果:

圖片描述

  • 霍夫圓檢測相比霍夫直線檢測計算量大,輸出引數多,
    因此一般都透過指定半徑範圍指定邊緣閾值累積器閾值減少計算量
    否則速度就會很慢,這個也是在使用的時候需要特別注意的。

上述三個指定引數如何影響霍夫圓檢測的計算量
  1. 指定半徑範圍:
    minRadius:檢測的最小圓半徑,單位為畫素。
    maxRadius:檢測的最大圓半徑,單位為畫素。
    即函式只檢測半徑處於minRadius和maxRadius之間的圓,所以指定半徑範圍自然能夠影響計算量了。

  2. 指定邊緣閾值
    霍夫圓檢測的基於內部邊緣檢測的結果;
    而邊緣閾值影響邊緣檢測最終留下的邊緣畫素,即影響內部邊緣檢測的結果,
    因而影響霍夫圓檢測的計算量;

  3. 累積器閾值
    此閾值的高低便是提取圓的要求的高低,高閾值高要求高計算量,反之亦然。

  • 此外廣義霍夫變換透過擴充,可以實現任意形狀的檢測,可以查閱其他相關的資料瞭解,這裡便不多說了。



作者:凌川江雪
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/506/viewspace-2821304/,如需轉載,請註明出處,否則將追究法律責任。

相關文章