我目前正在使用此代码计算Sobel梯度的大小:
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中有更好的方法:
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
似乎只适用于标量)。
有什么想法吗?
答案 0 :(得分:3)
正如您已经指出的那样,cv.Sqrt()
只接受Python绑定中的标量。由于存在执行元素方形根的等效函数cv::sqrt()
,因此它也应该在大多数自动生成的Python绑定中。也许这是您正在使用的OpenCV版本中的一个错误。
无论如何,您应该能够使用cv.Pow()
来获得相同的结果:
cv.Pow(src, dst, 0.5)
这可能没有cv.Sqrt()
那么快,但仍应远远超过元素计算。