缺點 霍夫圓 霍夫變換

2021-10-13 06:00:53 字數 3398 閱讀 6954

霍夫變換是一種特徵提取,被廣泛應用在影象分析、電腦視覺以及數字影像處理。 霍夫變換是用來辨別找出物件中的特徵,例如:線條。他的演算法流程大致如下,給定乙個物件、要辨別的形狀的種類,演算法會在引數空間中執行投票來決定物體的形狀,而這是由累加空間(accumulator space)裡的區域性最大值來決定。

經典的霍夫變換用於檢測影象中的直線,原理是利用座標空間變換將兩個座標進行相應的轉化,或通過直線對映到另一座標空間的點形成的峰值,從而把檢測任意形狀的問題轉化為統計峰值的問題。經典的霍夫變換的突出優點是分割結果的魯棒性,其缺點是要求知道物體邊界線的解析方程。學習一下霍夫變換的基本原理。

以直線檢測為例,每個畫素座標點經過空間變換都變成對直線特質有貢獻的統一度量。對於二維影象資料f(x,y),平面座標為(x,y)極座標(r,θ),如圖所示:

影象中的一條直線就是影象中一系列離散畫素點的集合,直線由平面座標轉換為極座標方程為:

將笛卡爾座標系轉換到極坐霍夫變換空間,這種點到曲線的對映變換就被稱為霍夫變換。

霍夫變換是基於影象二值化的變換,利用二值化影象中的點集來確定候選直線的集合。在影象的邊界處可以用方程f(x,p) = 0表示任意的曲線,其中p為曲線的引數向量,那麼利用霍夫變換進行line檢測的演算法步驟如下:

1. 在引數p的範圍內量化引數空間,將霍夫空間座標(r,θ)初始化為0

2. 在閾值化後的梯度影象中,對每個影象點(i,j)進行遍歷,對於滿足引數p,累計所有的f(x,p) = 0即s(p) = s(p)+△p.

3. 計算當前霍夫變換空間的s(p)的區域性最大值,對應曲線f(x,p)=0 的解析實現。

在opencv中霍夫變換演算法,可以使用houghlines呼叫標準霍夫變換(sht),多尺度霍夫變換(msht),msht為sht在多尺度下的乙個變種。而統計概率霍夫變換(ppht)則使用houghlinesp呼叫,ppht是在一定範圍內統計峰值,而不是整個平面,這樣就減少了計算量。

ppht是使用cv::houghlinesp實現。其中houghlinesp函式原型如下:

void cv::houghlinesp(inputarray image,outputarrat lines,double rho,double theta,int threshold,double minlinelength = 0,double maxlinegap=0)

引數說明:image : 二值化的影象即單通道8bit的影象

lines : 輸出線向量,每個線向量由(r,θ),r表示距離原點的距離,θ為角度。

rho : 以畫素為單位的距離精度,直線搜尋時的尺寸的單位半徑。

theta : 弧度的精度,直線搜尋時的尺寸的單位角度

threshold : 表示檢測一條直線所需最少的交點。

minlength: 最小的直線長度

maxlinegap : 同一行點與點連線起來的最大距離

sht和msht都是使用cv::houghlines() ,函式原型如下:

void cv::houghlines(inputarray image,outputarray lines,double rho,double theta,int threshold,double srn = 0,double stn = 0)

引數說明:image : 二值化的影象即單通道8bit的影象

lines : 輸出線向量,每個線向量由(ρ,θ),ρ表示距離原點的距離,θ為角度。

rho : 以畫素為單位的距離精度,直線搜尋時的尺寸的單位半徑。

theta : 弧度的精度,直線搜尋時的尺寸的單位角度

threshold : 表示檢測一條直線所需最少的交點。

srn: 多尺度霍夫變換引數,距離分辨ρ因子

stn : 多尺度霍夫變換引數,距離分辨θ因子

**示例如下:

#include #include #include int main(int argc,char **ar**)

cv::mat srcimage = cv::imread(ar**[1]);

if (!srcimage.data)

std::cout << "fail to load image" <<:endl>

return -1;

cv::mat edgemat,houghmatp,houghmat;

//邊緣檢測,轉化為二值影象 cv::canny(srcimage,edgemat,50,200,3);

cv::cvtcolor(edgemat,houghmatp,cv::color_gray2bgr);

cv::cvtcolor(edgemat,houghmat,cv::color_gray2bgr);

if (false) {

// std::vector<:vec2f> lines2f;

cv::houghlines(edgemat, houghmat, 1, cv_pi / 180, 100, 0, 0);

for (int j = 0; j < lines2f.size(); ++j) {

float rho = lines2f[j][0];

float theta = lines2f[j][1];

cv::point pt1, pt2;

double x0 = rho * cos(theta), y0 = rho * sin(theta);

pt1.x = cvround(x0 + 1000 * (-sin(theta)));

pt1.y = cvround(y0 + 1000 * cos(theta));

pt2.x = cvround(x0 - 1000 * (-sin(theta)));

pt2.y = cvround(y0 - 1000 * cos(theta));

cv::line(houghmat, pt1, pt2, cv::scalar(0, 0, 255), 3, cv::line_aa);

cv::imshow("houghline", houghmat);

else {

//進行霍夫變換 std::vector<:vec4i> lines;

cv::houghlinesp(edgemat, lines, 1, cv_pi / 180, 50, 50, 10);

for (int i = 0; i < lines.size(); ++i) {

cv::vec4i l = lines[i];

cv::line(houghmatp, cv::point(l[0], l[1]), cv::point(l[2], l[3]), cv::scalar(0, 0, 255), 3, cv::line_aa);

cv::imshow("houghlinep",houghmatp);

cv::imshow("srcimage",srcimage);

cv::waitkey(0);

cv::destroyallwindows();

return 0;

結果如圖:

缺點 霍夫圓 霍夫圓變換

對於直線來說,一條直線能有引數極徑級角表示,而對圓來說我們需要三個引數來表示乙個圓 在opencv中,我們常常通過乙個叫 霍夫梯度法 的方法來解決圓變換的問題。霍夫梯度法的原理 1 首先對影象應用邊緣檢測,比如canny邊緣檢測 2 然後對邊緣影象中的每乙個非零點,考慮其區域性梯度,即用sobel函...

OpenCV 霍夫線變換 霍夫圓變換

關於霍夫變換在官方文件opencv249裡的描述如下 api如下 void houghlines inputarray image,outputarray lines,double rho,double theta,int threshold,double srn 0,double stn 0 vo...

霍夫圓變換

對於直線來說,一條直線能有引數極徑級角表示,而對圓來說我們需要三個引數來表示乙個圓 在opencv中,我們常常通過乙個叫 霍夫梯度法 的方法來解決圓變換的問題。霍夫梯度法的原理 1 首先對影象應用邊緣檢測,比如canny邊緣檢測 2 然後對邊緣影象中的每乙個非零點,考慮其區域性梯度,即用sobel函...