OpenCV中霍夫直线变换
OpenCV中霍夫直線變換
首先要知道,一條直線的通用表達(dá)式為y=ax+b\color{#F00}y=ax+by=ax+b,a為直線的斜率,b為直線的截距,知道這兩個參數(shù)可以唯一確定一條直線。通常我們往常我們求三個點,是否在一條直線上,我們讓其兩兩組合分別求斜率和截距,如果一樣,我們則說三個點在同一條直線。但是現(xiàn)在在我們的圖像中無法使用這樣的方法。
y=kx+b\color{#f00}y=kx+by=kx+b在x-y坐標(biāo)系中變換為b=?xk+y\color{#f00}b=-xk+yb=?xk+y,則在k-b坐標(biāo)系中交于一點,則有相同的k和b,所以在x-y坐標(biāo)系中處于同一條直線上。同樣的道理在霍夫變換采用將直線變?yōu)闃O坐標(biāo),因為直線坐標(biāo)的話可能會存在直線不存在的情況。
x=ρcosθandy=ρsinθ\color{#f00}x=\rho cos\theta \quad and \quad y=\rho sin\theta x=ρcosθandy=ρsinθ
y=(?cosθsinθ)x+(rsinθ)\color{#f00}y=(-\frac{cos\theta}{sin\theta})x+(\frac{r}{sin\theta})y=(?sinθcosθ?)x+(sinθr?)
最終我們將原式轉(zhuǎn)化為r=xcosθ+ysinθ\color{#f00}r=xcos\theta+ysin\thetar=xcosθ+ysinθ這樣的形式。
下面就說說這樣的形式有什么用?
根據(jù)上式:
r0=x0cosθ+y0sinθr_0= x_0cos\theta + y_0sin\thetar0?=x0?cosθ+y0?sinθ
............
ri=xicosθ+yisinθr_i = x_icos\theta + y_isin\thetari?=xi?cosθ+yi?sinθ
選中(x0,y0)(x_0,y_0)(x0?,y0?)在該點計算θ從1?180的直線到(0,0)的距離,從而繪制出θ?r的圖像\theta{從1-180的直線到(0,0)的距離,從而繪制出}\theta-r的圖像θ從1?180的直線到(0,0)的距離,從而繪制出θ?r的圖像如下圖:
同樣的,我們再選取(xi,yi)(x_i,y_i)(xi?,yi?)點執(zhí)行相同的操作,又可以得到一條曲線。這樣我們我們選取i個點就得到了i條曲線,如下圖:
當(dāng)多條直線有交點時,就證明(xn,yn)和(xm,ym)(x_n,y_n){和}(x_m,y_m)(xn?,yn?)和(xm?,ym?)在相同的θ\thetaθ時擁有相同的r,在上述的式子中可以知道,當(dāng)這兩個值相同時,這兩個點在同一條直線上。那么當(dāng)有若干條曲線交于一點,那么這若干個點都在一條直線上。
上述敘述了在數(shù)學(xué)鄰域的計算推導(dǎo),那么如何應(yīng)用與圖像中呢?
我們知道一幅圖像可以看成一個大的矩陣,而霍夫直線檢測一般應(yīng)用于邊緣檢測之后,所以一般都是灰度圖。從而我們可以將圖像看成下面這個樣子。
[x00…x0i………xi0…xii]\begin{bmatrix}x_{00}&\ldots&x_{0i}\\ \ldots&\ldots&\ldots \\ x_{i0}&\ldots&x_{ii}\end{bmatrix}???x00?…xi0??………?x0i?…xii?????
具體的如何利用圖像像素來進(jìn)行上述原理的實現(xiàn),不是很清楚,我搜了一下,也沒有注意到。但是我有一種猜測,因為要進(jìn)行霍夫變換的都是邊緣檢測后的二值圖像,所以在進(jìn)行霍夫變換時,只對邊緣信息的像素的進(jìn)行上述的處理。具體內(nèi)部實現(xiàn),未知。
HoughLinesP(輸入圖像,8位,單通道輸出包含四個元素的vector,(x1,y1,x2,y2)兩個直線端點像素最小單位,角度最小單位,極坐標(biāo)中交點個數(shù),最小長度,兩個點之間最大的間距,如果小于,則連接視為同一條直線。 ); #include "opencv2/opencv.hpp" #include <vector>using namespace std; using namespace cv;int main(int argc, char *argv[]) {Mat src,dst;src = imread("/home/dynamicw/Project/C++_Project/opencvtest/src/lesson01/source/white_black.png",0);Canny(src,dst,50,200,3);cvtColor(dst,src,CV_GRAY2BGR);vector<Vec4i> lines;HoughLinesP(dst,lines,1,CV_PI/180,30,3,5);for (size_t i = 0;i < lines.size();i++){Vec4i l = lines[i];line(src,Point(l[0],l[1]),Point(l[2],l[3]),Scalar(0,0,255),3,CV_AA);}imshow("src",src);waitKey(0);return 0; }總結(jié)
以上是生活随笔為你收集整理的OpenCV中霍夫直线变换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人的“肥胖”基因FTO可促进水稻和土豆增
- 下一篇: 高颜值在线绘图平台ImageGP系列教程