首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sobel梯度震级的有效计算

Sobel梯度震级的有效计算
EN

Stack Overflow用户
提问于 2011-07-05 11:56:35
回答 1查看 4.1K关注 0票数 2

我现在正在使用这个代码来计算Sobel梯度的大小:

代码语言:javascript
复制
sobel_x = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_16S, 1)
sobel_y = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_16S, 1)
cv.Sobel(im, sobel_x, 1, 0, 3)
cv.Sobel(im, sobel_y, 0, 1, 3)

width, height = cv.GetSize(im)
for i in range(width*height):
    x, _, _, _ = cv.Get1D(sobel_x, i)
    y, _, _, _ = cv.Get1D(sobel_y, i)
    px = int(math.sqrt(x*x + y*y))
    cv.Set1D(sobel, i, px)

这很简单,但效率不是很高,因为我是逐个访问每个像素的。我希望在OpenCV中有一种更好的方法来做到这一点:

代码语言:javascript
复制
sobel_x2 = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_32S, 1)
sobel_y2 = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_32S, 1)
sobel_2  = cv.CreateImage(cv.GetSize(im), cv.IPL_DEPTH_32S, 1)
cv.Mul(sobel_x, sobel_x, sobel_x2)
cv.Mul(sobel_y, sobel_y, sobel_y2)
cv.Add(sobel_x2, sobel_y2, sobel_2)

在这里,我只是对图像进行平方并添加它们。它使用更多的内存,但应该更快,因为现在一些操作将并行完成。我坚持的是没有元素级的平方根函数(cv.Sqrt似乎只适用于标量)。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-05 15:16:13

正如您已经注意到的,cv.Sqrt()只接受Python绑定中的标量。因为有一个等价的函数cv::sqrt(),它执行基于元素的平方根,所以它也应该在大多数自动生成的Python绑定中。也许这是您正在使用的OpenCV版本中的错误。

无论如何,您应该能够使用cv.Pow()获得相同的结果:

代码语言:javascript
复制
cv.Pow(src, dst, 0.5)

这可能不会像cv.Sqrt()那样快,但仍然应该大大优于基于元素的计算。

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

https://stackoverflow.com/questions/6577836

复制
相关文章

相似问题

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