日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV 霍夫变换

發(fā)布時(shí)間:2024/3/26 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV 霍夫变换 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

一、霍夫直線變換
1. cv2.HoughLines()
1. cv2.HoughLinesP()
二、霍夫圓環(huán)變化


????????霍夫變化是一種在圖像中尋找直線、圓形以及其他簡(jiǎn)單形狀的方法。霍夫變換采用類似于投票的方式來(lái)獲取當(dāng)前圖像內(nèi)的形狀集合,該變換由 Paul Hough(霍夫)1962 年首次提出。最初霍夫變換只能用于檢測(cè)直線,經(jīng)過(guò)發(fā)展后,霍夫變換不僅能識(shí)別直線,還能識(shí)別其他簡(jiǎn)單的圖形結(jié)構(gòu),常見(jiàn)的有圓、橢圓等。
一、霍夫直線變換

????OpenCV 提供了函數(shù) cv2.HoughLines()和函數(shù) cv2.HoughLinesP()用來(lái)實(shí)現(xiàn)霍夫直線變換。

1. cv2.HoughLines()

????OpenCV 提供了函數(shù) cv2.HoughLines() 用來(lái)實(shí)現(xiàn)霍夫直線變換,該函數(shù)要求所操作的源圖像是一個(gè)二值圖像,所以在進(jìn)行霍夫變換之前要先將源圖像進(jìn)行二值化,或者進(jìn)行 Canny 邊緣檢測(cè)。

函數(shù) cv2.HoughLines() 的語(yǔ)法格式為:

????lines = cv2.HoughLines(image, rho, theta, threshold)

? image 是輸入圖像,即源圖像,必須是8位的單通道二值圖像。如果是其他類型的圖像,再進(jìn)行霍夫變換之前,需要將其修改為指定格式
? rho 為以像素為單位的距離r的進(jìn)度。一般情況下,使用的進(jìn)度是1
? theta 為角度θ的精度。一般情況下,使用的精度是π/180,表示要搜索所有可能的角度
? threshold 是閾值。閾值越小,就會(huì)得到較多的直線;閾值較大,就會(huì)得到較小的直線
? 返回值 lines 中的每一個(gè)元素都是一對(duì)浮點(diǎn)數(shù),表示檢測(cè)到的直線的參數(shù),即(r,θ),是numpy.ndarray類型

???函數(shù)cv2.HoughLines() 檢測(cè)到的圖像中的直線而不是線段,因此檢測(cè)到的直線是沒(méi)有端點(diǎn)的。所以,我們?cè)谶M(jìn)行霍夫直線變換時(shí)所繪制的直線都是穿越整幅圖像的。

1. cv2.HoughLinesP()

??概率霍夫變換對(duì)基本霍夫變換算法進(jìn)行了一些修正,是霍夫變換算法的優(yōu)化。他沒(méi)有考慮所有的點(diǎn)。相反,他只需要一個(gè)足以進(jìn)行線檢測(cè)是隨機(jī)點(diǎn)集合即可。

函數(shù) cv2.HoughLines() 的語(yǔ)法格式為:

????lines = cv2.HoughLinesP(image, rho, theta, threshold, minLineLength, maxLineGap)

? minLineLength 用來(lái)控制“接受直線的最小長(zhǎng)度”的值,默認(rèn)為0
? maxLineGap 用來(lái)控制接受共線線段之間的最小間隔,即在一條線中兩點(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 邊緣檢測(cè)和霍夫變換結(jié)合。其語(yǔ)法格式為:

????circles= cv2.HoughCircles(image, method, dp, minDist, param1,param2,minRadius, maxRadius)

? method 該參數(shù)代表的是霍夫圓檢測(cè)中兩輪檢測(cè)所使用的方法
? dp 累機(jī)器分辨率,他是一個(gè)分割比率,用來(lái)制定圖像分辨率與圓心累加器分辨率的比例
? param1 該參數(shù)是缺省的,在缺省時(shí)默認(rèn)值為100
? param2 圓心位置必須收到的投票數(shù)。只有在第一輪刪選過(guò)程中,投票數(shù)超過(guò)該值的圓,才有資格進(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 霍夫变换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。