Image 傅里叶形状描述符

Image 傅里叶形状描述符,image,fourier-descriptors,Image,Fourier Descriptors,我正在看一篇名为“使用通用傅立叶描述符进行基于形状的图像检索”的论文,但对傅立叶描述符只有基本的了解。我正在尝试实现论文第12页的算法,并且得到了一些我无法理解的结果 如果我创建一个小图像,计算图像的FD,并将FD与在x和y方向上被单个像素平移的相同图像进行比较,描述符完全不同,除了第一个条目-完全相同。首先,一个问题是,这两个图像之间的描述符是否应该完全相同(因为描述符显然是缩放、旋转和平移不变的) 其次,在本文中,它提到两个单独图像的描述符通过一个简单的欧几里德距离进行比较-因此,通过取上述

我正在看一篇名为“使用通用傅立叶描述符进行基于形状的图像检索”的论文,但对傅立叶描述符只有基本的了解。我正在尝试实现论文第12页的算法,并且得到了一些我无法理解的结果

如果我创建一个小图像,计算图像的FD,并将FD与在x和y方向上被单个像素平移的相同图像进行比较,描述符完全不同,除了第一个条目-完全相同。首先,一个问题是,这两个图像之间的描述符是否应该完全相同(因为描述符显然是缩放、旋转和平移不变的)

其次,在本文中,它提到两个单独图像的描述符通过一个简单的欧几里德距离进行比较-因此,通过取上述两个描述符之间的欧几里德距离,欧几里德距离显然为0

我很快编写了一些Javascript代码来测试算法,如下所示

有没有人有任何意见、想法和前进的方法

谢谢, 保罗

var-iShape=[
0,   0,   0,   0,   0,
0,   0, 255,   0,   0,
0, 255, 255, 255,   0,
0,   0, 255,   0,   0,
0,   0,   0,   0,   0
];
var ImageWidth=5,ImageHeight=5,MaxRFreq=5,MaxAFreq=5;
//计算质心
var cX=0,cY=0,pCount=0;
对于(x=0;xmaxR){
maxR=r;
}
}
}
}
//初始化实/虚表
var i;
var-FR=[];
var FI=[];
对于(r=0;r<(MaxRFreq);r++){
var-rRow=[];
FR.push(箭头);
var aRow=[];
FI.推(aRow);
对于(a=0;a<(MaxAFreq);a++){
旋转推力(0.0);
顺时针推力(0.0);
}
}
变量rFreq,aFreq,x,y;				
对于(rFreq=0;rFreq}
为了使最终描述符对1)平移和2)缩放3)旋转保持不变,这里应用了三种不同的标准化技术

对于平移不变性部分,您需要找到形状的质心,并计算以质心为原点的每个轮廓点的向量。这是通过分别从每个点的坐标中减去质心的x和y坐标来实现的。因此,在您的代码中,每个点的半径和θ应计算如下:

var radius = Math.sqrt(Math.pow(x - cX, 2) + Math.pow(y - cY, 2));
var theta = Math.atan2(y - cY, x - cX);
对于比例不变性部分,您需要找到每个向量(已为平移不变性标准化)的最大磁单位(或您所说的半径),并将每个点的大小除以最大大小值。实现这一点的另一种方法是将每个傅里叶系数除以零频率系数(第一个系数),因为其中表示的是尺度信息。正如我在你的代码和论文中看到的,这是根据我描述的第二种方式实现的

最后,旋转不变性仅通过保持傅里叶系数的大小来实现,正如您在本文伪代码的第6步中所看到的那样

除此之外,请记住,为了将欧几里德距离应用于描述符比较,每个形状的描述符长度必须相同。在FFT中,最终系数的数量取决于形状轮廓点的数量。我找到的解决方案是在点之间插值,以便为每个形状达到固定数量的点

希望我能帮忙,
Lazaros

哦,如果有人感兴趣,这篇论文就在这里。嗨,我还在研究基于傅立叶描述子的形状匹配。拉扎罗斯的投入非常有用。之前我对每个坐标进行微分轮廓编码,将其转换为x,iy复坐标,采用dft。当我与另一个具有相同对象的图像进行比较时,我得到了非常大的欧几里德距离值。在findi之前,我做高斯模糊、自适应阈值和膨胀