使用边缘检测,fft和SAD进行数字检测

我正在做一个项目,我想通过边缘检测来找到闭合轮廓的坐标,然后使用FFT来切除较高的频率,从而检测出手写的6。截止后,我在频率空间中将不同的“数字或字符”与例如SAD进行比较,以确定输入图像是否为6。

在进行边缘检测之后,我最终得到了向量中的坐标,并对其进行绘制,可以清楚地看到它可以完成工作:

绘制了六个数字:

使用边缘检测,fft和SAD进行数字检测

此后,我将X,Y坐标转换为复数并对它们执行FFT(matlab)。因为我想截止说最高频率的70%加上去掉DC部分(使其平移不变),是matlab FFT的输出已经按频率排序了?

在此之后,我切断了一定百分比的频率,并使其缩放和旋转不变,也将归一化并去除了复数的角度。


im = X+1j*Y; %covert to complex numbers
list = fft(im); %perform fft

top30 = list(2:round(length(list)*usedPercent)); %remove dc part and only keeping a certain percentage of the output from fft

top30 = top30/norm(top30); %normalize to make scale-invariant
top30=abs(top30); % removing the angle to make it rotation-invariant

上面的部分用作从不同数字/字符的不同图像创建频率列表以进行实际比较的功能,我使用了“参考”数字6,然后将所有输入与之比较,例如SAD下方:

test_six = sum(abs(var1(1:min(size(var1),size(var2)))-var2(1:min(size(var1),size(var2))))) 

% var1 is the frequencies obtained from my reference number six
% var2 is the frequencies obtained from another number six

因为频率的输出大小不同,所以我只比较min(n1,n2) 频率,我不确定这是否是执行SAD的正确方法。

将我的参考数字6与数字7进行比较时,SAD值比将其与其他六个数字进行比较时的低,这些是图像:

另外六个图:

使用边缘检测,fft和SAD进行数字检测

绘制了七个数字:

使用边缘检测,fft和SAD进行数字检测

由于闭合轮廓未考虑6中的“孔”,所以7与6非常接近并不奇怪,但我仍然感到惊讶的是它实际上得到的SAD值低于其他6 。比较旋转的六个(即非常类似于九)时,我得到的SAD值非常低,这是可以预期的,因为它的旋转不变。

这是否是解决问题的好方法,还是我在这里犯了一些重大错误?

默认情况下,matlabs FFT的输出是否按频率对数字进行排序?还是我必须手动执行该操作?

这种实现SAD比较的方法是正确的还是有更好的解决方案来比较结果?

非常感谢!

king1302218 回答:使用边缘检测,fft和SAD进行数字检测

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3155000.html

大家都在问