我正在尝试从白色和黑色的文本中检测字符。目前,文本是白色背景,只有几个黑色字符。此外,我创建了一些只包含每个字符的小图像。我想使用相位相关来检测初始文本中的字符。为此,我做了:
image = im2double(imread("text.png"));
si = size(image);
trans = fft2(image);
ch = im2double(imread("a.bmp"));
chtrans = fft2(ch,si(1),si(2));
outt = angle(trans).*conj(angle(chtrans));
outt = abs(ifft2(outt)).^2;
当我将outt变量标准化时,我检测到例如文本中的所有“a”,但图像是双倍的:正确的结果,但是在同一个最终图像上也会翻转正确的结果。这有什么问题?
答案 0 :(得分:1)
这是傅立叶变换的一个特征 - 它将检测正负频率分量;如果你愿意,你可以忽略负面部分。
答案 1 :(得分:1)
将角度反馈回IFFT不会隔离相位。你想要一个具有相同角度的复数,但幅度为1.你不想要一个代表角度的实数。表达相位相关的一种方法是归一化共轭乘法的结果:
outt = trans.*conj(chtrans);
outt = outt ./ abs(outt);
outt = real(ifft2(outt));
还有其他表达方式,但无论如何,镜像都会消失。要记住的一件事是,你的结果理想上应该是纯粹的真实。任何虚构的组件都是由于舍入误差造成的。如果你发现你需要对结果做abs(),你可能做错了。