<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          基于Python利用OpenCV實(shí)現(xiàn)Hough變換的形狀檢測(cè)

          共 3831字,需瀏覽 8分鐘

           ·

          2022-01-14 21:18

          點(diǎn)擊上方小白學(xué)視覺(jué)”,選擇加"星標(biāo)"或“置頂

          重磅干貨,第一時(shí)間送達(dá)

          今天我們將學(xué)習(xí)如何借助霍夫變換技術(shù)來(lái)檢測(cè)圖像中的直線和圓。


          什么是霍夫空間?

          在我們開(kāi)始對(duì)圖像應(yīng)用霍夫變換之前,我們需要了解霍夫空間是什么,我們將通過(guò)一個(gè)例子來(lái)進(jìn)行了解。


          參數(shù)空間

          當(dāng)我們處理圖像時(shí),我們可以將圖像想象成是某個(gè) x 和 y 坐標(biāo)上的二維矩陣,在該坐標(biāo)下,一條線可以被描述為 y = mx + b。

          參數(shù)空間

          在參數(shù)空間中,我們稱之為霍夫空間,我可以用 m 和 b 來(lái)表示同一條線,因此圖像空間中的一條線的表征將是霍夫空間中 m-b 位置的一個(gè)點(diǎn)。

          霍夫空間

          但是我們有一個(gè)問(wèn)題,當(dāng) y = mx + b 時(shí),我們不能表示一條垂直線,因?yàn)樾甭适菬o(wú)限的。所以我們需要一種更好的參數(shù)化方式,極坐標(biāo)(ρ 和 θ)。


          霍夫空間

          • ρ:描述直線與原點(diǎn)的距離

          • θ:描述遠(yuǎn)離水平線極坐標(biāo)的角度

          線極坐標(biāo)

          不過(guò),一個(gè)非常重要的觀察結(jié)果是,當(dāng)我們?cè)谝粭l線上取多個(gè)點(diǎn),然后我們變換到我們的霍夫空間時(shí),會(huì)發(fā)生什么呢?

          霍夫空間中的點(diǎn)線關(guān)系

          圖像空間上的單個(gè)點(diǎn)轉(zhuǎn)化為霍夫空間上的曲線,其特殊性是圖像空間上一條直線之間的點(diǎn)將由具有單個(gè)接觸點(diǎn)的多條曲線表示。


          這將是我們的目標(biāo),找到一組曲線相交的點(diǎn)。


          什么是霍夫變換?

          霍夫變換是一種特征提取方法,用于檢測(cè)圖像中的簡(jiǎn)單形狀,如圓、線等。


          “簡(jiǎn)單”特征是通過(guò)參數(shù)的形狀表示推導(dǎo)出來(lái)的。一個(gè)“簡(jiǎn)單”的形狀將僅由幾個(gè)參數(shù)來(lái)表示,例如一條直線可以用它的斜率和截距來(lái)表示,或者一個(gè)圓可以用 x、y 和半徑來(lái)表示。


          在我們的直線示例中,霍夫變換將負(fù)責(zé)處理圖像上的點(diǎn)并計(jì)算霍夫空間中的值。


          進(jìn)行轉(zhuǎn)換并隨后找到相交曲線的算法有點(diǎn)復(fù)雜,因此超出了本文的范圍。不過(guò),我們將看看這個(gè)算法的實(shí)現(xiàn),它是OpenCV庫(kù)的一部分。


          使用 OpenCV 檢測(cè)直線

          在OpenCV中,使用霍夫變換的線檢測(cè)是在函數(shù)HoughLines和HoughLinesP(概率霍夫變換)中實(shí)現(xiàn)的。我們將重點(diǎn)討論后者。


          該函數(shù)需要以下參數(shù):


          • image : 8 位單通道二進(jìn)制源圖像,該功能可以修改圖像。

          • lines : 線的輸出向量。每條線由一個(gè) 4 元素向量 (x_1, y_1, x_2, y_2) 表示,其中 (x_1,y_1) 和 (x_2, y_2) 是每個(gè)檢測(cè)到的線段的端點(diǎn)。

          • rho :累加器的距離分辨率(以像素為單位)。

          • theta :累加器的角度分辨率(以弧度為單位的)。

          • threshold :累加器閾值參數(shù),只有獲得足夠票數(shù)的行才會(huì)被返回。

          • minLineLength : 最小線長(zhǎng)度,小于該長(zhǎng)度的線段將被拒絕。

          • maxLineGap :同一直線上連接點(diǎn)的最大允許間距。


          舉個(gè)例子讓我們能夠更好的理解:

          # Read image img = cv2.imread('lanes.jpg', cv2.IMREAD_COLOR)# Convert the image to gray-scalegray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# Find the edges in the image using canny detectoredges = cv2.Canny(gray, 50, 200)# Detect points that form a linelines = cv2.HoughLinesP(edges, 1, np.pi/180, max_slider, minLineLength=10, maxLineGap=250)# Draw lines on the imagefor line in lines:    x1, y1, x2, y2 = line[0]    cv2.line(img, (x1, y1), (x2, y2), (255, 0, 0), 3)# Show resultcv2.imshow("Result Image", img)


          結(jié)果如下:

          線路檢測(cè)示例

          我們實(shí)際使用僅邊緣圖像作為霍夫變換的參數(shù)非常重要,否則算法將無(wú)法按預(yù)期工作。


          使用 OpenCV 檢測(cè)圓

          該過(guò)程與直線的過(guò)程大致相同,不同之處在于這次我們將使用 OpenCV 庫(kù)中的不同函數(shù)。我們現(xiàn)在將使用 HoughCircles,它接受以下參數(shù):


          • image: 8 位、單通道、灰度輸入圖像。

          • circles:找到的圓的輸出向量。每個(gè)向量都被編碼為一個(gè) 3 元素的浮點(diǎn)向量 (x, y, radius) 。

          • circle_storage: 在 C 函數(shù)中,這是一個(gè)內(nèi)存存儲(chǔ),將包含找到的圓的輸出序列。

          • method: 使用的檢測(cè)方法。目前唯一實(shí)現(xiàn)的方法是 CV_HOUGH_GRADIENT ,基本上是 21HT。

          • dp: 累加器分辨率與圖像分辨率的反比。例如,如果 dp=1 ,則累加器具有與輸入圖像相同的分辨率。如果 dp=2 ,累加器的寬度和高度是原來(lái)的一半。

          • minDist:檢測(cè)到的圓的中心之間的最小距離。如果參數(shù)太小,則除了真實(shí)圓圈之外,可能還會(huì)錯(cuò)誤地檢測(cè)到多個(gè)相鄰圓;如果太大,可能會(huì)遺漏一些圓圈。

          • param1:第一個(gè)方法特定的參數(shù)。在 CV_HOUGH_GRADIENT 的情況下,它是傳遞給 Canny () 邊緣檢測(cè)器的兩個(gè)閾值中較高的閾值(較低的閾值是較小的兩倍)。

          • param2:第二個(gè)方法特定的參數(shù)。在 CV_HOUGH_GRADIENT 的情況下,它是檢測(cè)階段圓心的累加器閾值。它越小,檢測(cè)到的假圓就越多,與較大累加器值相對(duì)應(yīng)的圓圈將首先返回。

          • minRadius:最小圓半徑。

          • maxRadius:最大圓半徑。


          需要注意的是,參數(shù)必須有所不同,因?yàn)槲覀儫o(wú)法使用與用于線的相同參數(shù)化來(lái)描述圓,而是需要使用類似 (x - x0)^^2 + (y - y0)^^2 = r^^2的方程.


          代碼:

          # Read image as gray-scaleimg = cv2.imread('circles.png', cv2.IMREAD_COLOR)# Convert to gray-scalegray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# Blur the image to reduce noiseimg_blur = cv2.medianBlur(gray, 5)# Apply hough transform on the imagecircles = cv2.HoughCircles(img_blur, cv2.HOUGH_GRADIENT, 1, img.shape[0]/64, param1=200, param2=10, minRadius=5, maxRadius=30)# Draw detected circlesif circles is not None:    circles = np.uint16(np.around(circles))    for i in circles[0, :]:        # Draw outer circle        cv2.circle(img, (i[0], i[1]), i[2], (0, 255, 0), 2)        # Draw inner circle        cv2.circle(img, (i[0], i[1]), 2, (0, 0, 255), 3)

          請(qǐng)注意,與前面的示例相比,我們?cè)谶@里不應(yīng)用任何邊緣檢測(cè)函數(shù),這是因?yàn)樵摵瘮?shù) HoughCircles 具有內(nèi)置的 Canny 檢測(cè)函數(shù)。


          結(jié)果:

          圓形檢測(cè)示例


          結(jié)論

          霍夫變換是一種用于檢測(cè)圖像中簡(jiǎn)單形狀的出色技術(shù),具有多種應(yīng)用,從醫(yī)學(xué)應(yīng)用(如 X 射線、CT 和 MRI 分析)到自動(dòng)駕駛汽車。




          下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
          在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺(jué)、目標(biāo)跟蹤、生物視覺(jué)、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目52講
          小白學(xué)視覺(jué)公眾號(hào)后臺(tái)回復(fù):Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目即可下載包括圖像分割、口罩檢測(cè)、車道線檢測(cè)、車輛計(jì)數(shù)、添加眼線、車牌識(shí)別、字符識(shí)別、情緒檢測(cè)、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺(jué)實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺(jué)。

          下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
          小白學(xué)視覺(jué)公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

          交流群


          歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺(jué)、傳感器自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺(jué)SLAM“。請(qǐng)按照格式備注,否則不予通過(guò)。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~


          瀏覽 67
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色一级片 | 豆花av免费观看 访问页面亚洲日韩 | 精品少妇人妻Av久久久牛牛 | 亚洲中文字幕第一页 | 男人天堂2024 |