【问题标题】:Phase correlation char相位相关字符
【发布时间】:2012-05-19 05:19:06
【问题描述】:

我正在尝试从黑白文本中检测字符。目前,文本是白色背景,只有几个黑色字符。我还创建了一些只包含一个字符的小图像。我想使用相位相关来检测初始文本中的字符。为此我已经完成了:

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”,但图像是双重的:有正确的结果,但也有正确的结果翻转,两者都在同一个最终图像上。这有什么问题?

【问题讨论】:

标签: matlab octave


【解决方案1】:

将角度反馈回 IFFT 不会隔离相位。您需要一个角度相同但幅度为 1 的复数。需要一个表示角度的实数。表达相位相关性的一种方法是对共轭乘法的结果进行归一化:

outt = trans.*conj(chtrans);
outt = outt ./ abs(outt);
outt = real(ifft2(outt));

还有其他的表达方式,但无论如何,镜像消失了。要记住的一件事是,理想情况下,您的结果应该是纯真实的。任何虚部都是由于舍入误差。如果你发现你需要对结果做 abs() ,你可能做错了什么。

【讨论】:

  • 非常感谢。我只使用了相位,因为我已经阅读了一份文档,在该文档中我了解到他们使用幅值 = 1 进行了所有处理,因为它们有更好的结果。也许检查整个图像是否相等(例如:2个字符)效果很好,但在这种情况下不是。
  • 哦!还有一件事!如果 abs(outt) 为 0,那么防止它的最佳模式是什么?在除法之前将 0.0000001 添加到 abs ?
  • 可能直接处理它:a = trans.*conj(chtrans); z = (a==0); a(z) = 1; outt = a ./ abs(a); outt(z) = 0; 在它开始为零的地方保持零。另请注意,这种归一化使振幅 = 1 与您描述的完全一样……只是 angle() 调用搞砸了这个过程。
【解决方案2】:

这是傅里叶变换的一个特征——它可以同时检测正负频率分量;如果你愿意,你可以忽略负面的部分。

【讨论】:

  • 我在 ifft2 之后但在获取 abs 之前添加了这个,这样我就可以从最终图像中删除负数:extra = real(outt)>= 0; outt = real(outt).*extra+ imag(outt).*extra;使用此代码,Extra 是一个矩阵,如果 outt 的值 >=0,则为 0,如果
猜你喜欢
  • 1970-01-01
  • 2010-10-10
  • 2012-01-07
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 2017-11-10
  • 1970-01-01
相关资源
最近更新 更多