花老溼學習OpenCV 霍夫圓變換與圓檢測

2021-09-24 09:15:01 字數 2823 閱讀 8508

霍夫圓變換的基本思路是認為影象上每乙個非零畫素點都有可能是乙個潛在的圓上的一點,跟霍夫線變換一樣,也是通過投票,生成累積座標平面,設定乙個累積權重來定位圓。

在笛卡爾座標系中圓的方程為:

其中(a,b)是圓心,r是半徑,也可以表述為:

所以在abr組成的三維座標系中,乙個點可以唯一確定乙個圓。而在笛卡爾的xy座標系中經過某一點的所有圓對映到abr座標系中就是一條三維的曲線:  

經過xy座標系中所有的非零畫素點的所有圓就構成了abr座標系中很多條三維的曲線。在xy座標系中同乙個圓上的所有點的圓方程是一樣的,它們對映到abr座標系中的是同乙個點,所以在abr座標系中該點就應該n條曲線相交(n為該點在xy座標系中對應圓的總畫素數)。通過判斷abr中每一點的相交(累積)數量,大於一定閾值的點就認為是圓。

以上是標準霍夫圓變換實現演算法,問題是它的累加面試乙個三維的空間,意味著比霍夫線變換需要更多的計算消耗。

opencv霍夫圓變換對標準霍夫圓變換做了運算上的優化。它採用的是「霍夫梯度法」。

可以參考:

第一階段:檢測圓心

1.1、對輸入影象邊緣檢測;

1.2、計算圖形的梯度,並確定圓周線,其中圓周的梯度就是它的法線;

1.3、在二維霍夫空間內,繪出所有圖形的梯度直線,某座標點上累加和的值越大,說明在該點上直線相交的次數越多,也就是越有可能是圓心;

1.4、在霍夫空間的4鄰域內進行非最大值抑制;

1.5、設定乙個閾值,霍夫空間內累加和大於該閾值的點就對應於圓心。

第二階段:檢測圓半徑

2.1、計算某乙個圓心到所有圓周線的距離,這些距離中就有該圓心所對應的圓的半徑的值,這些半徑值當然是相等的,並且這些圓半徑的數量要遠遠大於其他距離值相等的數量;

2.2、設定兩個閾值,定義為最大半徑和最小半徑,保留距離在這兩個半徑之間的值,這意味著我們檢測的圓不能太大,也不能太小;

2.3、對保留下來的距離進行排序;

2.4、找到距離相同的那些值,並計算相同值的數量;

2.5、設定乙個閾值,只有相同值的數量大於該閾值,才認為該值是該圓心對應的圓半徑;

2.6、對每乙個圓心,完成上面的2.1~2.5步驟,得到所有的圓半徑。

image為輸入影象,要求是灰度影象

circles為輸出圓向量,每個向量包括三個浮點型的元素——圓心橫座標,圓心縱座標和圓半徑

method為使用霍夫變換圓檢測的演算法,只實現了霍夫梯度法cv_hough_gradient

dp為第一階段所使用的累加器的解析度,dp=1時表示霍夫空間與輸入影象空間的大小一致,dp=2時霍夫空間是輸入影象空間的一半,以此類推

mindist為圓心之間的最小距離,如果檢測到的兩個圓心之間距離小於該值,則認為它們是同乙個圓心

param1為邊緣檢測時使用canny運算元的高閾值

param2為步驟1.5和步驟2.5中所共有的閾值

minradius和maxradius為所檢測到的圓半徑的最小值和最大值

**例項:

#include "pch.h"

#include #include "opencv2/opencv.hpp"

using namespace std;

using namespace cv;

int main()

imshow("src", src);

//高斯模糊或者中值模糊

mat blursrc;

//gaussianblur(src, blursrc, size(3, 3), 0, 0);

medianblur(src, blursrc, 3);

//轉化為灰度圖

mat graysrc;

cvtcolor(blursrc, graysrc, color_bgr2gray);

//進行霍夫圓檢測

疑問:霍夫梯度法 1.3 1.4步的二維霍夫空間指的是什麼? 座標為(a,b)嗎??

還有此例中,同心圓該如何檢測?

花老溼OpenCV學習 中值濾波

中值濾波器是一種統計排序濾波器,不是線性核,目標影象每個畫素都是源影象相應位置乙個視窗 核 中所有元素的中值。如圖所示 api介紹如下 當影象中少量具有較大偏差的點也會嚴重影響到均值濾波,但是中值濾波可以採用取中間值的方法消除這種異常值。椒鹽雜訊也稱為脈衝雜訊,是影象中經常見到的一種雜訊,它是一種隨...

花老溼學習OpenCV 膨脹和腐蝕

影象形態學操作 基於形狀的一系列影象處理操作的合集,主要是基於集合論基礎上的形態學數學 形態學有四個基本操作 腐蝕 膨脹 開 閉 膨脹與腐蝕是影象處理中最常用的形態學操作手段。跟卷積操作類似,假設有影象 a和結構元素 b,結構元素b在 a上面移動,其中 b定義其中心為錨點,計算 b覆蓋下 a的最大畫...

opencv 霍夫圓變換

參考 1 官方文件api 2 d6 d00 tutorial py root.html 官方英文教程 3 4 高階教程 5 官方英文教程 6 7 8 opencv論壇 9 官方github 10 注 安裝的版本 opencv python 3.3.0 cp36 cp36m win amd64.whl...