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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

霍夫变换——HoughLines、HoughLinesP和HoughCircles

發(fā)布時間:2024/3/26 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 霍夫变换——HoughLines、HoughLinesP和HoughCircles 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、霍夫變換

1、霍夫變換是一種在圖像中尋找直線、圓形及其他簡單形狀的方法。
2、笛卡爾空間與霍夫空間映射關(guān)系

  • 笛卡爾空間內(nèi)的一條直線確定了霍夫空間內(nèi)的一個點。
  • 霍夫空間內(nèi)的一個點確定了笛卡爾空間內(nèi)的一條直線。

3、霍夫變換選擇直線的基本思路:選擇由盡可能多條線匯成的點。

二、直線檢測

1、繪制直線方法

  • 垂直方向的直線,計算它與圖像水平邊界的交叉點,在兩個交叉點之間畫線。
  • 水平方向的直線,在圖像的第一列和最后一列之間畫線。

2、cv.line優(yōu)點

沒有必要檢查交叉點是否位于圖像內(nèi)部,即使點的坐標(biāo)超出了圖像的范圍,也能正確畫出線來。

3、基本霍夫變換——HoughLines函數(shù)
(1)要求:所操作的原圖像是一個二值圖像,變換之前先將原圖像進行二值化或進行canny邊緣檢測。
(2)HoughLines檢測到的是圖像中的直線而不是線段,即檢測到的直線是沒有端點的。
(3)代碼

# 直線檢測 def line_detection(image):gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)edges = cv.Canny(gray, 50, 150, apertureSize=3)"""HoughLines(image, rho, theta, threshold, lines=None, srn=None, stn=None, min_theta=None, max_theta=None)image:8位,單通道二值源圖像rho:以像素為單位的距離r的精度,一般為1.theta:角度0的精度, CV.PI/180表示搜索所有可能的角度。threshold:閾值,線段超過設(shè)定的閾值才被檢測出來。值越小,判定出的直線就越多。lines:檢測到的直線的參數(shù)vector(ρ,θ) or (ρ,θ,votes) ;ρ是距坐標(biāo)原點的距離,θ是以弧度表示的線旋轉(zhuǎn)角度(0~垂直直線,π/2~水平直線) ,votes 曲線交點累加計數(shù)srn:stn:min_theta:檢查線條的最小角度。必須介于0和maxθ之間。max_theta:要檢查線條的最大角度。必須介于minθ和CV_PI之間"""lines = cv.HoughLines(edges, 1, np.pi / 180, 200)# 遍歷lines,繪制出所有的直線for line in lines:rho, theta = line[0]a = np.cos(theta)b = np.sin(theta)x0 = a * rhoy0 = b * rhox1 = int(x0 + 1000 * (-b))y1 = int(y0 + 1000 * a)x2 = int(x0 - 1000 * (-b))y2 = int(y0 - 1000 * a)cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)cv.imshow('image_lines', image)



2、概率霍夫變換——HoughLinesP函數(shù)

概率霍夫變換沒有考慮所有的點,只需要一個足以進行檢測的隨機點子集即可。

def line_detect_possible_demo(image):gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)edges = cv.Canny(gray, 50, 150, apertureSize=3)"""HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None)minLineLength:用來控制“接受直線的最小長度”的值,默認0maxLineGap:用來控制接受共線線段之間的最小間隔,如果兩點之間的最大間隔大于maxLineGap,認為這兩點不在一條線上,默認0"""lines = cv.HoughLinesP(edges, 1, np.pi / 180, 100, minLineLength=50, maxLineGap=10)for line in lines:x1, y1, x2, y2 = line[0]cv.line(image, (x1, y1), (x2, y2), (0, 255, 0), 2)cv.imshow('line_detect_possible_demo', image)


三、圓檢測

霍夫圓變換中,需要考慮圓半徑和圓心(x坐標(biāo),y坐標(biāo))共3個系數(shù),采用的策略是兩輪篩選。第1輪篩選找出可能存在圓的位置(圓心),第2輪再根據(jù)第1輪的結(jié)果篩選出半徑大小。

def Mdetect_circles_demo(image):""":param image: pyrMeanShiftFiltering(src, sp, sr, dst=None, maxLevel=None, termcrit=None):return: src:輸入圖像,8位,三通道的彩色圖像sp:定義的漂移物理空間半徑大小sr:定義的漂移色彩空間半徑大小dst:輸出圖像,跟輸入src有同樣的大小和數(shù)據(jù)格式maxLevel:定義金字塔的最大層數(shù)termcrit:定義的漂移迭代終止條件,可以設(shè)置為迭代次數(shù)滿足終止,迭代目標(biāo)與中心點偏差滿足終止,或者兩者的結(jié)合"""# pyrMeanShiftFiltering:漂移圓檢測dst = cv.pyrMeanShiftFiltering(image, 50, 30)circles = np.uint16(np.around(dst))for i in circles[0, :]:cv.circle(image, (i[0], i[1]), i[2], (0, 0, 255), 2)cv.circle(image, (i[0], i[1]), 2, (255, 0, 0), 2)cv.imshow('Mdetect_circles_demo', image)def circles_demo(image):# 消除噪聲cimage = cv.cvtColor(image, cv.COLOR_BGR2GRAY)circle = cv.HoughCircles(cimage, cv.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)circles = np.uint16(np.around(circle))for i in circles[0, :]:# 取圓心cv.circle(image, (i[0], i[1]), 2, (255, 0, 0), 2)cv.imshow('circles_demo', image)def detect_circles_demo(image):# 消除噪聲cimage = cv.cvtColor(image, cv.COLOR_BGR2GRAY)"""HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None)image:8位單通道灰度圖像method:檢測方法,HOUGH_GRADIENT:基于梯度做比較快且是唯一可用的參數(shù)值dp:累加器分辨率,用來指定圖像分辨率與圓心累加器分辨率的比率。1表示輸入圖像和累加器具有相同的分辨率。minDist:圓心間的最小間距。如果存在圓心間距離小于該值的圓,僅有一個會被檢測出來。如20:把小于20最近的多個合并成一個圓。circles:返回值,由圓心坐標(biāo)和半徑構(gòu)成的numpy.ndarryparam1:缺省,默認100.對應(yīng)是canny邊緣檢測器的高閾值(底閾值是高閾值的二分之一)param2:圓心位置必須收到的投票數(shù)。值越大,檢測到的圓越少;越小,檢測到的圓越多。缺省,默認100.minRadius:圓半徑的最小值,小于該值的圓不會被檢測出來。缺省,默認0,不起作用。maxRadius:圓半徑的最大值,大于該值的圓不會被檢測出來。缺省,默認0,不起作用。"""circle = cv.HoughCircles(cimage, cv.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)"""around(a, decimals=0, out=None)a:輸入列表或矩陣decimals:為n對輸入近似后保留小數(shù)點后n位,默認為0,若值為-n,則對小數(shù)點左邊第n位近似out:保存近似返回結(jié)果"""circles = np.uint16(np.around(circle))for i in circles[0, :]:# 圖像,中心點位置,半徑,顏色"""circle(img, center, radius, color, thickness=None, lineType=None, shift=None)img:單通道或多通道的圖像center:圓心坐標(biāo)radius:半徑,數(shù)值為整數(shù)類型color:圓線條的顏色thickness:圓線條的粗細,值越大則線條越粗。lineType:線條的類型。CV_AA(采用了高斯濾波)三個值,分別代表8鄰接連接線,4鄰接連接線和反鋸齒連接線,默認值為8鄰接。shift:圓心坐標(biāo)點和半徑值的小數(shù)點位數(shù),數(shù)值為整數(shù)類型。"""# 圓變換cv.circle(image, (i[0], i[1]), i[2], (0, 0, 255), 2)cv.imshow('detect_circles_demo', image)

總結(jié)

以上是生活随笔為你收集整理的霍夫变换——HoughLines、HoughLinesP和HoughCircles的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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