【问题标题】:How can I improve this algorithm ? (Image Processing)我该如何改进这个算法? (图像处理)
【发布时间】:2016-06-11 18:41:27
【问题描述】:

好的,经过几个小时关于图像处理主题的文档(我是初学者),我决定自己实现一个边缘检测功能,以更好地理解其背后的数学原理。幸运的是我能够做到,但我的算法太慢了(O(n ^ 2))。我将在下面发布带有帧处理部分的代码:

ret, frame = cap.read()
grayed  = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
rows, cols = grayed.shape
for row in range(rows-2):
    for col in range(cols-2):
        Gx = grayed.item(row+2,col)+2*grayed.item(row+2,col+1)+grayed.item(row+2,col+1)-(grayed.item(row,col)+2*grayed.item(row,col+1)+grayed.item(row,col+2))
        Gy = grayed.item(row,col+2)+2*grayed.item(row+1,col+2)+grayed.item(row+2,col+1)-(grayed.item(row,col)+2*grayed.item(row+1,col)+grayed.item(row+2,col))
        grad = math.sqrt(Gx**2 + Gy**2)
        grayed.itemset((row, col), grad)
cv2.imshow('frame', grayed)
if cv2.waitKey(1) & 0xFF == ord('q'):
    break

提前致谢!

【问题讨论】:

  • 我不是python专家,但我会从bumpy开始使用ndarray,它应该会加速这个过程。
  • 您能否提供更多关于您传递给此函数的数据类型的信息?也许发布一个小例子。我相信您可以使用 numpy 或 numpy 和 Cython 的组合来大大加快速度。使用 Cython 将使您接近 C 速度。这当然只会改变算法的运行时间,但仍然是 O(n^2)。
  • 我已经编辑了我的帖子。我开始使用灰度图像而不是未触及的框架,它确实加快了我的进程。我也删除了内核创建,因为它根本没有用。问题是它仍然不够快。
  • 我认为它与代码审查有关:codereview.stackexchange.com
  • @AndreySmorodov 你读过他们的on-topic help centre?

标签: python opencv image-processing


【解决方案1】:

我分析了你的代码:

您正在应用两个渐变滤镜,一个用于方向x,一个用于y

这些过滤器看起来像:

-1 -2 -1
 0  0  0
 1  3  0

-1 0 1
-2 0 2
-1 1 0

我猜这些是拼写错误(?),而您更想拥有这些:

Gx:

-1 -2 -1
 0  0  0
 1  2  1

对于Gy

-1 0 1
-2 0 2
-1 0 1

此过滤过程也称为convolution。事实上,由于内核也是 2d,因此您的运行时为 O(4)。网上有很多资源,比如in this answer

您确实可以通过使用convolution 的概念来提高理论运行时间。例如,如果使用 FFT,运行时间可以降低到 O(n^2*log^2(n))

但是,使用scipy - convolveopencv - filter2D 的过滤方法可以获得更多的性能提升。 它们将有一个非常好的运行时,而且可能更重要的是,它们是用 C 实现的,并且不会像使用 python 循环时那样显着减慢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    相关资源
    最近更新 更多