c++ hough变换代码_hough变换原理以及实现(转载)
原理鏈接如下:陌歸:霍夫(Hough)變換之直線檢測
代碼鏈接:Ganso:Fundamentals——從車道線檢測談到霍夫變換
同樣是一篇講解原理的番外,這一篇主要講解CV中常用的霍夫變換的數(shù)學(xué)原理。
霍夫變換的由來
“霍夫變換于1962年由Paul Hough首次提出,最初的Hough變換是設(shè)計用來檢測直線和曲線,起初的方法要求知道物體邊界線的解析方程,但不需要有關(guān)區(qū)域位置的先驗知識。后于1972年由Richard Duda & Peter Hart推廣使用。”其實,霍夫變換的中心思想就是通過坐標(biāo)變換來檢測直線,后來經(jīng)過改進(jìn),就可以檢測橢圓等。
霍夫線變換
坐標(biāo)系的角度:
說起直線,我們會想到笛卡爾坐標(biāo)系(即x-y坐標(biāo)系)下的直線方程,細(xì)分之則有點(diǎn)斜式、截距式等,
是我們最熟悉的一種。但直線垂直于x軸時斜率 不存在,這給我們帶來許多不便之處。這時極坐標(biāo)就carry全場了,它與笛卡爾坐標(biāo)系的轉(zhuǎn)換關(guān)系:
,變形可得 , 為原點(diǎn)到直線的距離,也常用 表示,示意圖如下:由此極坐標(biāo)下,直線可用
表示。這就啟發(fā)我們,同一直線上的點(diǎn)具有相同的 :x-y坐標(biāo)系下的一個點(diǎn)在rho-theta坐標(biāo)系下為正弦曲線同一直線上的點(diǎn)會有相同的rho和theta,即在rho-theta下交于一點(diǎn)統(tǒng)計學(xué)的角度:
內(nèi)容出自:Opencv學(xué)習(xí)筆記-----霍夫變換直線檢測及原理理解 - CSDN博客如上圖,假定在一個8*8的平面像素中有一條直線,并且從左上角
像素點(diǎn)開始分別計算 為0°、45°、90°、135°、180°時的 ,圖中可以看出 分別為 ,并給這5個值分別記一票,同理計算像素點(diǎn) 點(diǎn) 為0°、45°、90°、135°、180°時的 ,再給計算出來的5個 值分別記一票,此時就會發(fā)現(xiàn) 的這個值已經(jīng)記了兩票了,以此類推,遍歷完整個8*8的像素空間的時候 就記了5票, 別的 值的票數(shù)均小于5票,所以得到該直線在這個8*8的像素坐標(biāo)中的極坐標(biāo)方程為 ,到此該直線方程就求出來了。霍夫圓變換
霍夫圓變換使用的算法叫霍夫梯度法,對應(yīng)的函數(shù)為HoughCircles,這個函數(shù)實際上是對常規(guī)找圓算法的一種改進(jìn),這里不展開講,想學(xué)習(xí)這個原理的同學(xué)請參考找圓算法((HoughCircles)總結(jié)與優(yōu)化 - CSDN博客
1. base
導(dǎo)入必要的包,順便寫一個打印圖像的函數(shù),cv2與plt顏色通道不一致(所以為什么不用plt導(dǎo)入呢)。
import numpy as np import matplotlib.pyplot as plt import cv2# opencv的顏色通道順序為[B,G,R],而matplotlib的顏色通道順序為[R,G,B]。 def plotImg(img):if len(img.shape)==3:img = img[:,:,(2,1,0)]plt.imshow(img)else:plt.imshow(img, cmap='gray')plt.show()導(dǎo)入圖片,感覺如果干擾很多效果也不會太好。
image = cv2.imread('test_image.jpg') plotImg(image)canny
灰度,模糊,canny三連擊。
canny輸入需求如此。
region_of_interest
手工特征區(qū)域?作者的思路也是蠻清奇的。
簡單來說就是對于視角前面的三角形區(qū)域做了一個mask,全部填充255,與原圖像bitwise。
2. Hough Transform
將圖像提取邊緣之后獲得了很多雜亂的點(diǎn),而我們需要做的就是找到過這些點(diǎn)的公共直線。
點(diǎn)斜式方程
點(diǎn)斜式方程是
,那么對于經(jīng)過下圖黑色點(diǎn)的直線簇,我們可以將其映射到一個以m,b位坐標(biāo)的空間,b是m的線性函數(shù)。對于不同的兩個點(diǎn),我們可以將其直線簇映射到mb空間的兩個直線上,而mb空間兩個直線的交點(diǎn)(m,b)就是這兩個點(diǎn)公共直線的參數(shù)。但是這樣還是存在問題的,當(dāng)直線是垂直的時候,m趨向于無窮,不好表示,我們需要另外一種映射。極坐標(biāo)方程
在極坐標(biāo)空間中,對于過固定點(diǎn)的直線,過原點(diǎn)做垂線,記距離為
,夾角為 ,通過圖示我們可以得到對于過一點(diǎn)x,y的直線簇有:也就是說過固定點(diǎn)的直線簇
與 之間有一定的函數(shù)關(guān)系。霍夫變換
我們將過每個點(diǎn)的直線簇映射到極坐標(biāo)空間,基本都由一條曲線表示,比如圖示的三個點(diǎn),這樣。曲線的交點(diǎn)對應(yīng)的坐標(biāo)就是過所有點(diǎn)的直線的極坐標(biāo)參數(shù)。
投票機(jī)制
當(dāng)圖片上的點(diǎn)非常多時,所有曲線并不期望相交于一點(diǎn)。我們可以將霍夫空間劃分為一個個patch,當(dāng)一個patch上面的交點(diǎn)滿足大于某個threshold時,我們視為這些點(diǎn)有它們的公共直線。
3. cv2實現(xiàn)
cv.2HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]])
參數(shù)
image 圖像。
rho、theta:分辨率。(分別率就是指同一個角度,如果計算出兩點(diǎn)的rio值小于2,則認(rèn)為是同一直線。)
threshold:投票閾值。
lines:沒有查到。
minLineLength:最小線條長度。
maxLineGap:最大線條間隔。
霍夫變換求直線
總結(jié)
以上是生活随笔為你收集整理的c++ hough变换代码_hough变换原理以及实现(转载)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 放大缩小保证div对齐_NFS Writ
- 下一篇: 如何固定最小宽度_如何使用更新的HTML