c# - 尝试在不使用 Matlab/Numpy/等的情况下对 2 个图像执行 2D 互相关
问题描述
我正在尝试在 C# 中对这两个图像执行互相关:
图像,模板
Matlab 说结果应该看起来像:Matlab 结果
但这是我的结果:我的结果
这是我的互相关函数:
public static Signal2D CrossCorrelation2D(Signal2D signal, Signal2D pulse) {
return InverseFFT2D(FFT2D(signal) * FFT2D(pulse).GetConjugate());
}
这是我的 FFT2D:
public static Signal2D FFT2D(Signal2D signal) {
Signal2D result = new Signal2D(signal.Height, signal.Width);
for (int i = 0; i < result.Height; i++)
result[i] = new ComplexNumber[signal[i].Length];
//rows
for (int n = 0; n < signal.Height; n++) {
result[n] = FFT(signal[n]);
}
//columns
for (int i = 0; i < signal[0].Length; i++) {
ComplexNumber[] col = new ComplexNumber[signal.Height];
for (int j = 0; j < col.Length; j++) {
col[j] = result[j][i];
}
col = FFT(col);
for (int j = 0; j < col.Length; j++) {
result[j][i] = col[j];
}
}
return result;
}
这是我的 FFT:
public static Signal FFT(Signal signal) {
int N = signal.Length;
if (N == 1)
return signal;
if ((N & (N - 1)) != 0)
throw new ArgumentOutOfRangeException("signal length must be a power of 2");
Signal evenArr = new Signal(N / 2);
Signal oddArr = new Signal(N / 2);
for (int i = 0; i < N / 2; i++) {
evenArr[i] = signal[2 * i];
}
evenArr = FFT(evenArr);
for (int i = 0; i < N / 2; i++) {
oddArr[i] = signal[2 * i + 1];
}
oddArr = FFT(oddArr);
Signal result = new Signal(N);
for (int k = 0; k < N / 2; k++) {
double w = -2.0 * k * Math.PI / N;
ComplexNumber wk = new ComplexNumber(Math.Cos(w), Math.Sin(w));
ComplexNumber even = evenArr[k];
ComplexNumber odd = oddArr[k];
result[k] = even + (wk * odd);
result[k + N / 2] = even - (wk * odd);
}
return result;
}
这是我的信号乘法(使用逐点乘法):
public static Signal2D operator* (Signal2D a, Signal2D b) {
if (a.Height != b.Height || a.Width != b.Width)
throw new ArgumentException("Sizes must be equal");
Signal2D result = new Signal2D(a.Height, a.Width);
for (int y = 0; y < a.Height; y++) {
for (int x = 0; x < a.Width; x++) {
result[y][x] = a[y][x] * b[y][x];
}
}
return result;
}
任何帮助表示赞赏,谢谢。
编辑:我将 matlab 图像保留为 1023 x 1023 的原始大小并覆盖了我的结果。看起来我可能已经得到了结果,我只是不确定 Matlab 是如何填充图像的。叠加结果(红色是我结果中的白色部分,灰色是我结果中的黑色部分。黑色/白色来自 Matlab)
解决方案
推荐阅读
- python - 在 Python 中标记一个句子并重新连接结果
- java - 使用 Open JDK 10.0.2 时,VirtualMachine attach 抛出 com.sun.tools.attach.AgentLoadException: 0
- c# - Sabre,获取 sessionRQ
- javascript - 如何获得父 div 中子元素的总和?
- cmd - 从命令提示符运行 Apache JMeter
- html - 如果悬停另一个类,则添加一个没有 jquery 的类
- data-binding - 为什么我的 CheckedListBoxEdit 没有绑定到项目列表?
- python - 如何对引发异常的python函数进行pytest
- java - Java protobuf 在根消息和子消息中设置字段
- glsl - 如何修复这个体积光着色器