Python 如何向OpenCV函数cv.dft()输入复数值?
我正在努力实现一篇研究论文中所述的内容。它描述了如何从图像中提取傅里叶特征。我试图在编码时遵循这些步骤,但反复遇到与输入数组的数据类型和维度相关的错误。 所以我问如何向函数输入复数值 我遵循了研究论文中的以下说明 傅立叶描述符:傅立叶描述符提供了一种编码方式 通过将每个像素位置(x,y)映射到 复数(x+y)Python 如何向OpenCV函数cv.dft()输入复数值?,python,numpy,opencv,dft,Python,Numpy,Opencv,Dft,我正在努力实现一篇研究论文中所述的内容。它描述了如何从图像中提取傅里叶特征。我试图在编码时遵循这些步骤,但反复遇到与输入数组的数据类型和维度相关的错误。 所以我问如何向函数输入复数值 我遵循了研究论文中的以下说明 傅立叶描述符:傅立叶描述符提供了一种编码方式 通过将每个像素位置(x,y)映射到 复数(x+y) 按顺序记录每个像素的坐标值 (沿形状顺时针移动) 使用坐标值构造复数向量 记录在步骤1中,即(x,y)→ (x+y) 取复值向量的DFT 我的问题出现在第三步 这是我的实现 def get
def get_dft(图像):
坐标=cv.findNonZero(图像)
#下面的代码删除了不必要的维度
坐标=坐标.重塑(坐标.形状[0],2)
y=坐标[:,1]*1j#转换为复数
#下面的代码删除了不必要的维度
y=y.重塑(坐标.形状[0],1)
x=坐标[:,0]。重塑(坐标.shape[0],1)
#下面的语句将从两个单独的数组进行转换
#到每个元素的单个数组
#形式为[a+jb]
t=x+y
#下面是发生错误的地方
dft=cv.dft(t,标志=cv.dft\u复数输入)
这就是我得到的错误
TypeError: Expected cv::UMat for argument 'src'
当我皈依为
a=numpy.ndarray(t)
我明白了
它想说有超过32个维度。我不明白为什么会这样
当我试着
a=numpy.ndarray([t])
我得到了错误
TypeError: only integer scalar arrays can be converted to a scalar index
简而言之,我想按照论文中提到的步骤,制作一个复数向量
[[a+jb],[c+jd]...]
并将其传递给DFT函数。我找到了解决此问题的方法
def get_dft(图像):
坐标=cv.findNonZero(图像)
坐标=坐标.重塑(坐标.形状[0],2).aType(浮点)
y=坐标[:,1]。重塑(坐标.shape[0],1)
x=坐标[:,0]。重塑(坐标.shape[0],1)
t=cv.merge([x,y])#用于转换为2个通道
dft=cv.dft(t,标志=cv.dft\u复数输入)
我尝试了所有的numpy api,但由于我不理解的原因,所有这些似乎都失败了,但幸运的是OpenCV
cv.merge(…)
成功了
它需要多个输入数组和连接来生成多通道输出
我还尝试向opencvapi函数输入复数
cv.dft(…)
这不是输入复数的正确方法。
它表示标志cv.DFT\u COMPLEX\u输入
指定输入为复杂输入。如果设置了此标志,则输入必须有2个通道。另一方面,出于向后兼容性的原因,如果输入有2个通道,则输入已经被认为是复杂的
请注意,我还面临的问题是转换为双通道,这是因为我没有正确理解函数输入所需的结构cv::UMat()
总结是,如果要在OpenCV API函数中输入复数
cv.dft(…)
您的输入必须由2个通道组成,以完成制作双通道阵列、OpenCV函数、
cv.merge(…)
,当您尝试组合多个单独的频道时,似乎可以正确地完成工作。我找到了解决问题的方法
def get_dft(图像):
坐标=cv.findNonZero(图像)
坐标=坐标.重塑(坐标.形状[0],2).aType(浮点)
y=坐标[:,1]。重塑(坐标.shape[0],1)
x=坐标[:,0]。重塑(坐标.shape[0],1)
t=cv.merge([x,y])#用于转换为2个通道
dft=cv.dft(t,标志=cv.dft\u复数输入)
我尝试了所有的numpy api,但由于我不理解的原因,所有这些似乎都失败了,但幸运的是OpenCV
cv.merge(…)
成功了
它需要多个输入数组和连接来生成多通道输出
我还尝试向opencvapi函数输入复数
cv.dft(…)
这不是输入复数的正确方法。
它表示标志cv.DFT\u COMPLEX\u输入
指定输入为复杂输入。如果设置了此标志,则输入必须有2个通道。另一方面,出于向后兼容性的原因,如果输入有2个通道,则输入已经被认为是复杂的
请注意,我还面临的问题是转换为双通道,这是因为我没有正确理解函数输入所需的结构cv::UMat()
总结是,如果要在OpenCV API函数中输入复数
cv.dft(…)
您的输入必须由2个通道组成,以完成制作双通道阵列、OpenCV函数、
cv.merge(…)
,当您尝试组合多个单独的频道时,似乎可以正确完成工作
[[a+jb],[c+jd]...]