猿问

Python Hough Lines 实现,提高时间效率

所以我正在尝试在 python 中实现霍夫变换线算法,我发现很难让它有时间效率。


这是我的实现:


import numpy as np

def houghLines(edges, dTheta, threshold):

    imageShape = edges.shape

    imageDiameter = (imageShape[0]**2 + imageShape[1]**2)**0.5

    rhoRange = [i for i in range(int(imageDiameter)+1)]

    thetaRange = [dTheta*i for i in range(int(-np.pi/(2*dTheta)), int(np.pi/dTheta))]

    cosTheta = [np.cos(theta) for theta in thetaRange]

    sinTheta = [np.sin(theta) for theta in thetaRange]

    countMatrix = np.zeros([len(rhoRange), len(thetaRange)])

    eds = [(x,y) for (x,y), value in np.ndenumerate(edges) if value > 0]

    for thetaIndex in range(len(thetaRange)):

        theta = thetaRange[thetaIndex]

        cos = cosTheta[thetaIndex]

        sin = sinTheta[thetaIndex]

        for x, y in eds:

            targetRho = x*cos + y*sin

            closestRhoIndex = int(round(targetRho))

            countMatrix[closestRhoIndex, thetaIndex] += 1

    lines = [(p,thetaRange[t]) for (p,t), value in np.ndenumerate(countMatrix) if value > threshold]

    return lines

它可以工作,但速度非常慢,比 opencv 实现慢 100 倍。


我该如何改进?


呼如林
浏览 231回答 1
1回答

开心每一天1111

答案是使用numba。这就是代码现在的样子:import numpy as npfrom numba import jit@jit(nopython=True)def houghLines(edges, dTheta, threshold):    imageShape = edges.shape    imageDiameter = (imageShape[0]**2 + imageShape[1]**2)**0.5    rhoRange = [i for i in range(int(imageDiameter)+1)]    thetaRange = [dTheta*i for i in range(int(-np.pi/(2*dTheta)), int(np.pi/dTheta))]    cosTheta = []    sinTheta = []    for theta in thetaRange:        cosTheta.append(np.cos(theta))        sinTheta.append(np.sin(theta))    countMatrixSize = (len(rhoRange), len(thetaRange))    countMatrix = np.zeros(countMatrixSize)    eds = []    for (x,y), value in np.ndenumerate(edges):        if value > 0:            eds.append((x,y))    for thetaIndex in range(len(thetaRange)):        theta = thetaRange[thetaIndex]        cos = cosTheta[thetaIndex]        sin = sinTheta[thetaIndex]        for x, y in eds:            targetRho = x*cos + y*sin            closestRhoIndex = int(round(targetRho))            countMatrix[closestRhoIndex, thetaIndex] += 1    lines = []    for (p,t), value in np.ndenumerate(countMatrix):        if value > threshold:            lines.append((p,thetaRange[t]))    return lines这使它至少快了 50 倍。
随时随地看视频慕课网APP

相关分类

Python
我要回答