OpenCV 霍夫变换
文章目錄
一、霍夫直線變換
1. cv2.HoughLines()
1. cv2.HoughLinesP()
二、霍夫圓環(huán)變化
????????霍夫變化是一種在圖像中尋找直線、圓形以及其他簡單形狀的方法。霍夫變換采用類似于投票的方式來獲取當(dāng)前圖像內(nèi)的形狀集合,該變換由 Paul Hough(霍夫)1962 年首次提出。最初霍夫變換只能用于檢測直線,經(jīng)過發(fā)展后,霍夫變換不僅能識別直線,還能識別其他簡單的圖形結(jié)構(gòu),常見的有圓、橢圓等。
一、霍夫直線變換
????OpenCV 提供了函數(shù) cv2.HoughLines()和函數(shù) cv2.HoughLinesP()用來實(shí)現(xiàn)霍夫直線變換。
1. cv2.HoughLines()
????OpenCV 提供了函數(shù) cv2.HoughLines() 用來實(shí)現(xiàn)霍夫直線變換,該函數(shù)要求所操作的源圖像是一個二值圖像,所以在進(jìn)行霍夫變換之前要先將源圖像進(jìn)行二值化,或者進(jìn)行 Canny 邊緣檢測。
函數(shù) cv2.HoughLines() 的語法格式為:
????lines = cv2.HoughLines(image, rho, theta, threshold)
? image 是輸入圖像,即源圖像,必須是8位的單通道二值圖像。如果是其他類型的圖像,再進(jìn)行霍夫變換之前,需要將其修改為指定格式
? rho 為以像素為單位的距離r的進(jìn)度。一般情況下,使用的進(jìn)度是1
? theta 為角度θ的精度。一般情況下,使用的精度是π/180,表示要搜索所有可能的角度
? threshold 是閾值。閾值越小,就會得到較多的直線;閾值較大,就會得到較小的直線
? 返回值 lines 中的每一個元素都是一對浮點(diǎn)數(shù),表示檢測到的直線的參數(shù),即(r,θ),是numpy.ndarray類型
???函數(shù)cv2.HoughLines() 檢測到的圖像中的直線而不是線段,因此檢測到的直線是沒有端點(diǎn)的。所以,我們在進(jìn)行霍夫直線變換時所繪制的直線都是穿越整幅圖像的。
1. cv2.HoughLinesP()
??概率霍夫變換對基本霍夫變換算法進(jìn)行了一些修正,是霍夫變換算法的優(yōu)化。他沒有考慮所有的點(diǎn)。相反,他只需要一個足以進(jìn)行線檢測是隨機(jī)點(diǎn)集合即可。
函數(shù) cv2.HoughLines() 的語法格式為:
????lines = cv2.HoughLinesP(image, rho, theta, threshold, minLineLength, maxLineGap)
? minLineLength 用來控制“接受直線的最小長度”的值,默認(rèn)為0
? maxLineGap 用來控制接受共線線段之間的最小間隔,即在一條線中兩點(diǎn)的最大間隔
代碼如下(示例):
import cv2
import numpy as np
img = cv2.imread("12.png") ?
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 轉(zhuǎn)為灰度圖?
edge = cv2.Canny (gray, 50, 150) # 畫邊框
minLineLength = 10
maxLineGap = 30
lines=cv2.HoughLinesP(edge,1,np.pi/180,50,minLineLength,maxLineGap )?
for line in lines:
? ? x1,y1,x2,y2 = line[0]
? ? cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)?
cv2.imshow("img ",img)
cv2.imshow("edge",edge)?
cv2.waitKey()
cv2.destroyAllWindows()
二、霍夫圓環(huán)變化
在 OpenCV 中,實(shí)現(xiàn)霍夫圓變換的是函數(shù) cv2.HoughCircles() ,該函數(shù)將 Canny 邊緣檢測和霍夫變換結(jié)合。其語法格式為:
????circles= cv2.HoughCircles(image, method, dp, minDist, param1,param2,minRadius, maxRadius)
? method 該參數(shù)代表的是霍夫圓檢測中兩輪檢測所使用的方法
? dp 累機(jī)器分辨率,他是一個分割比率,用來制定圖像分辨率與圓心累加器分辨率的比例
? param1 該參數(shù)是缺省的,在缺省時默認(rèn)值為100
? param2 圓心位置必須收到的投票數(shù)。只有在第一輪刪選過程中,投票數(shù)超過該值的圓,才有資格進(jìn)入第二輪刪選
? minDist 圓心間的最小間距
? minRadius 圓半徑的最小值
? maxRadius 圓半徑的最大值
? circles 返回值,由圓心坐標(biāo)和半徑構(gòu)成的 numpy.ndarray
代碼如下(示例):
import cv2
import numpy as np
img = cv2.imread("12.png") ?
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 轉(zhuǎn)為灰度圖?
edge = cv2.Canny (gray, 50, 150) # 畫邊框
circles=cv2.HoughCircles(edge,cv2.HOUGH_GRADIENT,1.30,50,param1=40,param2=20,\
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?minRadius=5,maxRadius=100)?
if not circles is None:
? ? circles = np.uint16(np.around(circles))
? ? for circle in circles:
? ? ? ? x,y,r = circle[0]
? ? ? ? cv2.circle(img,(x,y),r,(0,0,255),2)?
cv2.imshow("img ",img)
cv2.imshow("edge",edge)?
cv2.waitKey()
cv2.destroyAllWindows()
總結(jié)
以上是生活随笔為你收集整理的OpenCV 霍夫变换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ZBrush基础操作
- 下一篇: asp.net web开发——文件的上传