Python TypeError:必需参数';范围';(位置2)未找到

Python TypeError:必需参数';范围';(位置2)未找到,python,opencv,cv2,Python,Opencv,Cv2,我是python新手,我尝试使用filter2D函数,但我遇到了这个错误 img_out=cv2.filter2D(img_in,-1,cv2.UMat(gb)); TypeError:找不到必需的参数“范围”(位置2)。。。这是什么意思 import numpy as np import cv2 def gabor_fn(sigma, theta, Lambda, psi, gamma): sigma_x = sigma sigm

我是python新手,我尝试使用filter2D函数,但我遇到了这个错误

img_out=cv2.filter2D(img_in,-1,cv2.UMat(gb));
TypeError:找不到必需的参数“范围”(位置2)。。。这是什么意思

      import numpy as np
      import cv2


      def gabor_fn(sigma, theta, Lambda, psi, gamma):
      sigma_x = sigma
      sigma_y = float(sigma) / gamma

      # Bounding box
      nstds = 3  # Number of standard deviation sigma
      xmax = max(abs(nstds * sigma_x * np.cos(theta)), abs(nstds * sigma_y * np.sin(theta)))
      xmax = np.ceil(max(1, xmax))
      ymax = max(abs(nstds * sigma_x * np.sin(theta)), abs(nstds * sigma_y * np.cos(theta)))
      ymax = np.ceil(max(1, ymax))
      xmin = -xmax
      ymin = -ymax
      (y, x) = np.meshgrid(np.arange(ymin, ymax + 1), np.arange(xmin, xmax + 1))

      x_theta = x * np.cos(theta) + y * np.sin(theta)
      y_theta = -x * np.sin(theta) + y * np.cos(theta)

      gb = np.exp(-0.5 * (np.power(x_theta, 2) / np.add(np.power(sigma_x, 2) , np.power(y_theta, 2)) / np.power(sigma_y, 2)* np.cos(2 * np.pi / Lambda * x_theta + psi[0])));

      return gb;


   Lambda = 8;
   theta = 0;
   psi = [0, np.pi / 2];
   gamma = 0.5;
   sigma = 1.0;
   N = 8;
   img_in = cv2.imread('1.jpg');
   img_in = cv2.cvtColor(img_in, cv2.COLOR_BGR2GRAY);

   for n in range(N):
     gb = np.add(gabor_fn(sigma, theta, Lambda, psi, gamma) , 1j * 
     gabor_fn(sigma, theta, Lambda, psi, gamma));
     img_out = cv2.filter2D(img_in,-1,cv2.UMat(gb));
     theta = theta + (2 * np.pi) / N

   img_out_disp = np.power(sum(np.power(abs(img_out), 2), 3), 0.5);
   img_out_disp = np.divide(img_out_disp, max(img_out_disp));

这意味着您要使用的函数要求在第二个位置有一个名为“ranges”的参数

但是,我不确定这是否是一个
filter2D
错误,因为这是函数的:

正如你所看到的-这里不需要“范围”。。。
可能还有另一个函数需要未提供的“ranges”参数。

这意味着您要使用的函数在第二个位置需要一个名为“ranges”的参数

但是,我不确定这是否是一个
filter2D
错误,因为这是函数的:

正如你所看到的-这里不需要“范围”。。。
可能还有另一个函数需要未提供的“ranges”参数。

不能使用OpenCV的
filter2D()
与复杂内核进行卷积。指定内核必须是“单通道浮点矩阵”

要使用OpenCV函数,您必须分别卷积内核的实部和虚部,并按照您的意愿组合结果

如果您使用的是Python,那么Scipy是另一个选项,它直接支持复杂的卷积。显示了一个带有复杂Scharr过滤器的示例


作为将来的参考,使用OpenCV,您可以通过函数直接获得Gabor内核,而不是自己计算,不过请注意,它只返回真实部分。

使用OpenCV的
filter2D()
不能与复杂内核进行卷积。指定内核必须是“单通道浮点矩阵”

要使用OpenCV函数,您必须分别卷积内核的实部和虚部,并按照您的意愿组合结果

如果您使用的是Python,那么Scipy是另一个选项,它直接支持复杂的卷积。显示了一个带有复杂Scharr过滤器的示例


作为将来的参考,使用OpenCV,您可以通过函数直接获得Gabor内核,而不是自己计算它,不过请注意,它只返回真实部分。

为什么要将其转换为
UMat
?因为我在转换之前遇到了此错误。。。TypeError:参数'kernel'应为cv::UMat您需要传递一个numpy数组作为内核。我想在内核参数中传递一个gabor内核,因为我正在尝试实现gabor过滤器。我用错误的语法传递它吗?gb=np.add(gabor_-fn(σ,θ,λ,psi,gamma),1j*gabor_-fn(σ,θ,λ,psi,gamma));img_out=cv2.filter2D(img_in,-1,gb);什么是gabor_fn?另外,请将代码添加到OP的编辑中,而不是添加到评论中。为什么要以
UMat
的身份进行转换?因为我在转换之前遇到了此错误。。。TypeError:参数'kernel'应为cv::UMat您需要传递一个numpy数组作为内核。我想在内核参数中传递一个gabor内核,因为我正在尝试实现gabor过滤器。我用错误的语法传递它吗?gb=np.add(gabor_-fn(σ,θ,λ,psi,gamma),1j*gabor_-fn(σ,θ,λ,psi,gamma));img_out=cv2.filter2D(img_in,-1,gb);什么是gabor_fn?另外,请将代码添加到操作的编辑中,而不是添加到注释中。我正在尝试在gabor内核和输入图像之间进行卷积,这就是代码。“gabor_fn”中不需要“范围”。你知道我怎样才能解决这个问题吗?对于范围(n)中的n:gb=np.add(gabor_-fn(σ,θ,λ,psi,gamma),1j*gabor_-fn(σ,θ,λ,psi,gamma));img_out=cv2.filter2D(img_in,-1,gb);θ=θ+(2*np.pi)/N;TypeError:所需参数“范围”(位置2)未找到img_out=cv2.filter2D(img_in,-1,cv2.UMat(gb));在这一行中,我试图在gabor核和输入图像之间进行卷积,这就是代码。“gabor_fn”中不需要“范围”。你知道我怎样才能解决这个问题吗?对于范围(n)中的n:gb=np.add(gabor_-fn(σ,θ,λ,psi,gamma),1j*gabor_-fn(σ,θ,λ,psi,gamma));img_out=cv2.filter2D(img_in,-1,gb);θ=θ+(2*np.pi)/N;TypeError:所需参数“范围”(位置2)未找到img_out=cv2.filter2D(img_in,-1,cv2.UMat(gb));在这条线上谢谢你!它与“getGaborFilter()”一起工作。非常感谢!它与“getGaborFilter()”一起工作。
Python: cv2.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]]) → dst¶