中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python?OpenCV?Hough直線檢測算法如何實現

發布時間:2022-07-18 09:38:07 來源:億速云 閱讀:160 作者:iii 欄目:開發技術

這篇文章主要介紹了Python OpenCV Hough直線檢測算法如何實現的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Python OpenCV Hough直線檢測算法如何實現文章都會有所收獲,下面我們一起來看看吧。

直線檢測原理

核心要點:圖像坐標空間、參數空間、極坐標參數空間 -> (極坐標)參數空間表決

給定一個點,我們一般會寫成y=ax+b的形式,這是坐標空間的寫法;我們也可以寫成b=-xa+y的形式,這是參數空間的寫法。也就是說,給定一個點,那么經過該點的直線的參數必然滿足b=-xa+y這一條件,也就是必然在參數空間中b=-xa+y這條直線上。如果給定兩個點,那么這兩點確定的唯一的直線的參數,就是參數空間中兩條參數直線的交點。

由于上述寫法不適合處理水平或垂直的直線,我們可以使用極坐標的形式描述直線,即ρ=xcosθ+ysinθ,其中ρ是從原點到直線的垂直距離,θ是由這條垂直線和水平軸形成的角度(以逆時針方向測量),

如下圖所示:

Python?OpenCV?Hough直線檢測算法如何實現

因此,任何垂直線θ=0,水平線θ=90°。那么極坐標參數空間中的曲線交點就是由兩個點確定的一條直線,如下圖所示。

Python?OpenCV?Hough直線檢測算法如何實現

現在讓我們看看Hough變換是如何處理直線的。任何一條線都可以用這兩個參數來表示(ρ,θ)。

  • 首先創建一個二維數組,即累加器,用來保存兩個參數的值,然后最初將其設置為全0。讓行表示ρ,列表示θ。數組的尺寸取決于所需的精度。假設希望角度的精度為1度,則需要180列,枚舉0°-179°的所有情況。對于ρ,可能的最大距離是圖像的對角線長度。因此,以一個像素的精度計算,行數可以是圖像的對角線長度。

  • 枚舉所有的點,對于每一個點,將所有經過這一點的直線對應的參數(ρ,θ)在參數空間中找到對應位置,令該位置的累加器加1,即投票。這一過程如下圖所示。

Python?OpenCV?Hough直線檢測算法如何實現

枚舉完成所有點之后,累加器中值最大的(若干個)參數組合(ρ,θ)就是經過點最多的(若干條)直線,如下圖所示,兩條直線對應累加器中最亮的兩個點。

Python?OpenCV?Hough直線檢測算法如何實現

總的來說,對于多個點,我們可以用(離散)參數空間表決的方法,記錄每個點對應的允許的參數組合,求得那些被允許次數最多的參數組合,就是最多點經過的直線。

在圖像矯正任務中,我們經過Canny算子檢測出了若干邊緣點,這些點主要集中在四個邊界上,因此我們只需要使用Hough直線檢測,求出四條直線,就能確定四個邊界。

OpenCV實現

cv.HoughLines()封裝了上述步驟,該函數原型為:

cv.HoughLines(image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]]) -> lines

參數:

  • lines:數組,每一個元素都是一條直線對應的(ρ, θ),ρ以像素為單位,θ以弧度為單位。

  • image:輸入圖像,需要是二值圖像,所以在應用hough變換之前應用閾值或canny邊緣檢測。

  • rho:ρ的精度。

  • theta:θ的精度。

  • threshold:閾值,得票數高于該值的線才被認為是線,由于投票數取決于線上的點數,所以它代表了應該被檢測到的線的最小點數。

下面是具體代碼:

def hough_detect(image_path):
    # 讀取圖像并轉換為灰度圖像
    image = cv2.imread(image_path)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # 使用Canny算子檢測邊緣
    edges = canny_detect(image_path, False)
    # 使用Hough檢測直線
    lines = cv2.HoughLines(edges, 1, np.pi/180, 200)
    # 繪制直線
    for line in lines:
        rho, theta = line[0]
        a = np.cos(theta)
        b = np.sin(theta)
        x0 = a * rho
        y0 = b * rho
        x1 = int(x0 + 1000*(-b))
        y1 = int(y0 + 1000*(a))
        x2 = int(x0 - 1000*(-b))
        y2 = int(y0 - 1000*(a))
        cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
    cv2.imshow('line,jpg', image)
    cv2.waitKey()
hough_detect('images/2.jpeg')

效果:

Python?OpenCV?Hough直線檢測算法如何實現

關于“Python OpenCV Hough直線檢測算法如何實現”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Python OpenCV Hough直線檢測算法如何實現”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

科技| 静宁县| 长兴县| 麦盖提县| 利津县| 夏邑县| 封丘县| 梓潼县| 连南| 罗江县| 江陵县| 滕州市| 房山区| 旬阳县| 无为县| 高台县| 金乡县| 贵溪市| 富源县| 察隅县| 盱眙县| 县级市| 肥东县| 丹巴县| 青铜峡市| 普兰店市| 建阳市| 蕲春县| 宁明县| 黄平县| 定安县| 通山县| 四子王旗| 营口市| 西峡县| 桃江县| 台江县| 谢通门县| 临澧县| 鄂托克前旗| 轮台县|