LNCC
在医学影像配准论文《U-Net vs Transformer: Is U-Net Outdated in Medical Image Registration》中,使用了LNCC(local normalized
cross-correlation局部归一化相关损失)作为相似性度量。查阅文章引用的论文,描述如下:
LNCC代码:
class NCC(torch.nn.Module):
"""
local (over window) normalized cross correlation
"""
def __init__(self, win=9, eps=1e-5):
super(NCC, self).__init__()
self.win_raw = win
self.eps = eps
self.win = win
def forward(self, I, J):
ndims = 3
win_size = self.win_raw
self.win = [self.win_raw] * ndims
weight_win_size = self.win_raw
weight = torch.ones((1, 1, weight_win_size, weight_win_size, weight_win_size), device=I.device, requires_grad=False)
conv_fn = F.conv3d
# compute CC squares
I2 = I*I
J2 = J*J
IJ = I*J
# compute filters
# compute local sums via convolution
I_sum = conv_fn(I, weight, padding=int(win_size/2))
J_sum = conv_fn(J, weight, padding=int(win_size/2))
I2_sum = conv_fn(I2, weight, padding=int(win_size/2))
J2_sum = conv_fn(J2, weight, padding=int(win_size/2))
IJ_sum = conv_fn(IJ, weight, padding=int(win_size/2))
# compute cross correlation
win_size = np.prod(self.win)#返回给定轴上的数组元素的乘积
u_I = I_sum/win_size
u_J = J_sum/win_size
#cross:计算协方差 I_var和J_var:计算方差部分
cross = IJ_sum - u_J*I_sum - u_I*J_sum + u_I*u_J*win_size
I_var = I2_sum - 2 * u_I * I_sum + u_I*u_I*win_size
J_var = J2_sum - 2 * u_J * J_sum + u_J*u_J*win_size
cc = cross * cross / (I_var * J_var + self.eps)
# return negative cc.
return -1.0 * torch.mean(cc)
补充
C
o
v
(
x
,
y
)
=
E
[
(
X
−
E
(
X
)
)
(
Y
−
E
(
Y
)
)
]
=
E
[
X
Y
−
X
E
(
Y
)
−
Y
E
(
X
)
+
E
(
X
)
E
(
Y
)
]
Cov(x,y)=E[(X-E(X))(Y-E(Y))] =E[XY-XE(Y)-YE(X)+E(X)E(Y)]
Cov(x,y)=E[(X−E(X))(Y−E(Y))]=E[XY−XE(Y)−YE(X)+E(X)E(Y)]
D
(
X
)
=
E
[
(
X
−
E
(
X
)
)
2
]
=
E
[
(
X
2
−
2
X
E
(
X
)
+
E
(
X
)
2
]
D(X) = E[(X-E(X))^2]=E[(X^2-2XE(X)+E(X)^2]
D(X)=E[(X−E(X))2]=E[(X2−2XE(X)+E(X)2]
参考:NCC