我正在尝试使用 B-Splines 作为变形模型进行自动非刚性图像配准,但我遇到了一些问题:
- 最初,我放了几个控制点(5x5),时间长了,效果不错,但是处理时间让人望而却步。
- 我已经阅读了很多关于图像配准的文章(例如 Rueckert 等人,1999 年),为了提高性能,作者使用了多级 B 样条变形,但算法对我来说并不完全清楚。
- 在这篇文章中,作者提出了一组公式(第 4.2 节)来增加控制点的数量而不改变 B-Spline 的形状,但是我的实现并没有返回我所期望的(例如,我期望应用这个新的10x10 控制点变换和具有相同的 5x5 变换)。
这是我的 MATLAB 实现:
function ref_coeff = refine_coeff_grid(c, ft, delta)
%c -- Control points
%ft -- image to be transformed
%delta -- spacing between the control points
[X,Y]=ndgrid(-delta:delta:(size(ft, 1) +(delta*2)), -delta:delta:(size(ft, 2)+(delta*2)));
[r, co, s] = size(c);
i = 2:(r-2);
j = 2:(co-2);
new_c = zeros(2*(r-3)+3, 2*(co-3)+3, s);
new_c(:, :, 1) = X;
new_c(:, :, 2) = Y;
new_c(2*i, 2*j, :) = (c(i-1, j-1, :) + c(i-1, j+1, :) + c(i+1, j-1, :) + c(i+1, j+1, :) + ...
6*(c(i-1, j, :) + c(i, j-1, :) + c(i, j+1, :) + c(i+1, j, :)) + 36*c(i, j, :))/64;
new_c(2*i, 2*j+1, :) = (c(i-1, j, :) + c(i-1, j+1, :) + c(i+1, j, :) + c(i+1, j+1, :) + 6*c(i, j, :) + 6*c(i, j+1, :))/16;
new_c(2*i+1, 2*j, :) = (c(i, j-1, :) + c(i, j+1, :) + c(i+1, j-1, :) + c(i+1, j+1, :) + 6*c(i, j, :) + 6*c(i+1, j, :))/16;
new_c(2*i+1, 2*j+1, :) = (c(i, j, :) + c(i, j+1, :) + c(i+1, j, :) + c(i+1, j+1, :))/4;
ref_coeff = new_c;
end
我究竟做错了什么?