OpenCV 霍夫变换
文章目錄
一、霍夫直線變換
1. cv2.HoughLines()
1. cv2.HoughLinesP()
二、霍夫圓環變化
????????霍夫變化是一種在圖像中尋找直線、圓形以及其他簡單形狀的方法。霍夫變換采用類似于投票的方式來獲取當前圖像內的形狀集合,該變換由 Paul Hough(霍夫)1962 年首次提出。最初霍夫變換只能用于檢測直線,經過發展后,霍夫變換不僅能識別直線,還能識別其他簡單的圖形結構,常見的有圓、橢圓等。
一、霍夫直線變換
????OpenCV 提供了函數 cv2.HoughLines()和函數 cv2.HoughLinesP()用來實現霍夫直線變換。
1. cv2.HoughLines()
????OpenCV 提供了函數 cv2.HoughLines() 用來實現霍夫直線變換,該函數要求所操作的源圖像是一個二值圖像,所以在進行霍夫變換之前要先將源圖像進行二值化,或者進行 Canny 邊緣檢測。
函數 cv2.HoughLines() 的語法格式為:
????lines = cv2.HoughLines(image, rho, theta, threshold)
? image 是輸入圖像,即源圖像,必須是8位的單通道二值圖像。如果是其他類型的圖像,再進行霍夫變換之前,需要將其修改為指定格式
? rho 為以像素為單位的距離r的進度。一般情況下,使用的進度是1
? theta 為角度θ的精度。一般情況下,使用的精度是π/180,表示要搜索所有可能的角度
? threshold 是閾值。閾值越小,就會得到較多的直線;閾值較大,就會得到較小的直線
? 返回值 lines 中的每一個元素都是一對浮點數,表示檢測到的直線的參數,即(r,θ),是numpy.ndarray類型
???函數cv2.HoughLines() 檢測到的圖像中的直線而不是線段,因此檢測到的直線是沒有端點的。所以,我們在進行霍夫直線變換時所繪制的直線都是穿越整幅圖像的。
1. cv2.HoughLinesP()
??概率霍夫變換對基本霍夫變換算法進行了一些修正,是霍夫變換算法的優化。他沒有考慮所有的點。相反,他只需要一個足以進行線檢測是隨機點集合即可。
函數 cv2.HoughLines() 的語法格式為:
????lines = cv2.HoughLinesP(image, rho, theta, threshold, minLineLength, maxLineGap)
? minLineLength 用來控制“接受直線的最小長度”的值,默認為0
? maxLineGap 用來控制接受共線線段之間的最小間隔,即在一條線中兩點的最大間隔
代碼如下(示例):
import cv2
import numpy as np
img = cv2.imread("12.png") ?
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 轉為灰度圖?
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()
二、霍夫圓環變化
在 OpenCV 中,實現霍夫圓變換的是函數 cv2.HoughCircles() ,該函數將 Canny 邊緣檢測和霍夫變換結合。其語法格式為:
????circles= cv2.HoughCircles(image, method, dp, minDist, param1,param2,minRadius, maxRadius)
? method 該參數代表的是霍夫圓檢測中兩輪檢測所使用的方法
? dp 累機器分辨率,他是一個分割比率,用來制定圖像分辨率與圓心累加器分辨率的比例
? param1 該參數是缺省的,在缺省時默認值為100
? param2 圓心位置必須收到的投票數。只有在第一輪刪選過程中,投票數超過該值的圓,才有資格進入第二輪刪選
? minDist 圓心間的最小間距
? minRadius 圓半徑的最小值
? maxRadius 圓半徑的最大值
? circles 返回值,由圓心坐標和半徑構成的 numpy.ndarray
代碼如下(示例):
import cv2
import numpy as np
img = cv2.imread("12.png") ?
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 轉為灰度圖?
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()
總結
以上是生活随笔為你收集整理的OpenCV 霍夫变换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ZBrush基础操作
- 下一篇: revit的常用插件出图有哪些?怎么快速