为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

呼如林 2021-10-12 17:45:34
所以我正在尝试在 python 中实现霍夫变换线算法,我发现很难让它有时间效率。这是我的实现:import numpy as npdef 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 倍。我该如何改进?
查看完整描述

1 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

答案是使用numba。这就是代码现在的样子:


import numpy as np

from 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 倍。


查看完整回答
反对 回复 2021-10-12
  • 1 回答
  • 0 关注
  • 230 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信