首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何改进这个算法?(图像处理)

如何改进这个算法?(图像处理)
EN

Stack Overflow用户
提问于 2016-06-11 18:41:27
回答 1查看 104关注 0票数 0

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

代码语言:javascript
复制
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

提前谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-13 17:58:11

我分析了你的代码:

你正在应用两个梯度滤波器,一个用于方向x,一个用于y

这些过滤器看起来像:

代码语言:javascript
复制
-1 -2 -1
 0  0  0
 1  3  0

代码语言:javascript
复制
-1 0 1
-2 0 2
-1 1 0

我猜这些是排字(?)你更想要这些:

Gx

代码语言:javascript
复制
-1 -2 -1
 0  0  0
 1  2  1

对于Gy

代码语言:javascript
复制
-1 0 1
-2 0 2
-1 0 1

这个过滤过程也称为convolution。实际上,您有一个O(4)运行时,因为内核也是2d。网络上有很多资源,比如在这个答案中

通过使用卷积的概念,您确实可以改进理论运行时。例如,如果使用快速傅立叶变换,运行时可以降到O(n^2*log^2(n))

但是,使用convolvefilter2D的过滤方法可以提高性能。它们将有一个非常好的运行时,而且可能更重要的是,它们是用C实现的,并且不会像使用python循环时那样显着地减慢速度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37767321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档