Python+OpenCV圖像處理之直線檢測


霍夫變換是圖像處理中從圖像中識別幾何形狀的基本方法之一,應用很廣泛,也有很多改進算法。主要用來從圖像中分離出具有某種相同特征的幾何形狀(如,直線,圓等)。

python實現

import cv2
import numpy as np
# 使用霍夫直線變換做直線檢測,前提條件:邊緣檢測已經完成

__author__ = "boboa"


# 標准霍夫線變換
def line_detection_demo(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray, 50, 150, apertureSize=3)
    lines = cv2.HoughLines(edges, 1, np.pi/180, 200)  # 函數將通過步長為1的半徑和步長為π/180的角來搜索所有可能的直線
    for line in lines:
        rho, theta = line[0]  # line[0]存儲的是點到直線的極徑和極角,其中極角是弧度表示的
        a = np.cos(theta)   # 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("image_lines", image)


# 統計概率霍夫線變換
def line_detect_possible_demo(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGRA2GRAY)
    edges = cv2.Canny(gray, 50, 150, apertureSize=3)
    # 函數將通過步長為1的半徑和步長為π/180的角來搜索所有可能的直線
    lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 100, minLineLength=50, maxLineGap=10)
    for line in lines:
        x1, y1, x2, y2 = line[0]
        cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
    cv2.imshow("line_detect_possible_demo", image)


if __name__ == "__main__":
    img = cv2.imread("image/lines.jpg")
    cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE)
    cv2.imshow("input image", img)
    line_detect_possible_demo(img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

標准霍夫線變換運行結果

統計概率霍夫線變換運行結果

標准霍夫線變換cv2.HoughLines(image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]]) -> lines

參數:image-邊緣檢測的輸出圖像,8位,單通道二進制源圖像

    rho-距離步長

    theta-角度步長

    threshold-閾值,只有大於該值的點才有可能被當作極大值,即至少有多少條正弦曲線交於一點才被認為是直線

統計概率霍夫線變換cv2.HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]]) -> lines

參數:image-邊緣檢測的輸出圖像,該圖像為單通道8位二進制圖像

     rho-參數極徑 r 以像素值為單位的分辨率,這里一般使用 1 像素

     theta-參數極角 \theta 以弧度為單位的分辨率,這里使用 1度

     threshold-檢測一條直線所需最少的曲線交點

     minLineLength-線的最短長度,比這個線短的都會被忽略

     maxLineGap-兩條線之間的最大間隔,如果小於此值,這兩條線就會被看成一條線。

HoughLinesP,效果更好,檢測圖像中分段的直線(而不是貫穿整個圖像的直線)




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM