C實現hough變換擬合直線

2021-07-29 05:49:40 字數 1856 閱讀 1902

原理:

對於平面上的乙個點(x1,y1),滿足方程:y1=mx1+b,經過點(x1,y1)的直線有無數條,只要其滿足剛才的直線方程。然而,可以把直線方程變形一下,b=-x1 m+y1,在考慮由點(m,b)組成的面,這裡叫為引數空間,由(-x1, y1)確定一條直線。同樣,由另外乙個點(x2,y2)可以確定引數空間的一條直線,b2= -x2m+y2。如果這條直線不平行於b=-x1 m+y1,那麼一定與其相交於某點(m』, b』),則可以看出m』、b』分別是由(x1,y2)和(x2,y2)組成的直線的斜率和截距。事實上,所有在此直線上的點在引數空間上都有一條直線,並且這些直線均相交於(m』, b』)。如下圖所示,左邊為影象空間,右邊為引數空間,影象中的乙個點,在引數空間對應一條直線,兩個點就對應兩條直線,在引數空間中的兩條直線相交於(m,b)點就對應影象空間中直線的斜率和截距。

演算法實現思想:對影象空間中的所有點將其對應至引數空間,然後找出引數空間中的直線相交最多的點作為影象空間中直線的引數,對應於在影象空間中,這條直線上的點最多。但是不能採用斜率和截距作為在實際中實現霍夫變換,因為在直線垂直於x軸時,直線斜率為無窮大,無論演算法的時間和空間複雜度都不允許。

所以,需要換一種直線的引數表示形式,採用座標原點到直線的距離和直線與x軸的夾角可以唯一表示一條直線。公式如下:

ρ=xcosθ+ysinθ

上式中,(x,y)為直線上某點的座標。ρ為座標原點到直線的距離,θ為直線與x軸的夾角。

對於某一影象,x、y的最大值分辨為影象寬、高的最大值,ρ的最大值為影象尺寸的對角線,最小值是個負值,也就是,θ為180度時的值(對影象座標來說,x、y沒有負值)。如下圖:

上面的公式推導如下圖:

不想畫,手繪了,這樣簡單些。

參考岡薩雷斯《數字影象處理第三版》。

**實現:

typedef struct hline_t

hline;

typedef struct _point_t

_point;

#ifndef max

#define max(a,b) (((a) > (b)) ? (a) : (b))

#endif

#define pi 3.14159265

void hough_line(_point *points, int count, int width, int height, hline* line)

memset(buf, 0, 181*maxd*sizeof(int));

for (i = 0; i < 181; i++)

for(i = 0; i < count; i++)

}for (i = 0; i < 181; i++) }}

line->p = maxp - mind;

line->theta = maxtheta;

free(buf);

free(m);

}

測試效果:

綠色為繪製的擬合結果,紅色部分為原始直線。

優化上的考慮:

可以將正弦、余弦值擴大1024倍做成**查詢,得到的結果右移10位即可。

Hough 變換檢測直線

hough 變換檢測直線的基本原理是 對x y 座標系下的每一點 x,y 對應極座標下為 rho x cos theta y sin theta 1 因此,對x y平面內的每一點,對應到極座標系則為一條直線,如果直角座標系下的點共線,則在極座標的直線會相交於一點。因此,求得極座標下相交最多的點,rh...

Hough變換檢測直線

1 基本原理 hough變換是影象處理中從影象中識別幾何形狀的基本方法之一,即它可以檢測已知形狀的目標,而且受雜訊和曲線間斷的影響小。hough變換的基本思想是利用點 線的對偶性。如下圖1所示 從圖1中可看出,x y座標和k b座標有點 線的對偶性。x y座標中的點p1 p2對應於k b座標中的l1...

Hough變換提取直線 Matlab實現

用hough變換提取直線 在對圖形進行直線檢測之前,需要對圖形進行邊緣檢測 二值化處理,用拉普拉斯演算法或canny提取邊緣 hough變換思想 1 在 的極值範圍內對其分別進行 m,n 等分,設乙個二維陣列的下標與 i j 的取值 對應 2 對影象上的所有邊緣點作 hough 變換,求每個點在 j...