MATLAB的PIQE函数有错吗?

Is MATLAB's PIQE function wrong?

我正在尝试为图像超分辨率训练深度学习模型,我想将 PIQE score 作为损失函数来实现。由于我将使用 pytorch 训练模型,因此我尝试自己 Python 实现算法来计算 PIQE 分数。

作为第一步,我查看了 MATLAB implementation of piqe(link 将您带到主页,但我正在查看源代码)以了解它是如何完成的,然后进行调整至 Python。然而,有一件事困扰着我。

PIQE 分数从使用以下公式计算均值减去对比度归一化系数开始:

但是那一步的matlab代码是这样的:

mu = imgaussfilt(ipImage,7/6,'FilterSize',7,'Padding','replicate');
sigma = sqrt(abs(imgaussfilt(ipImage.*ipImage,7/6,'FilterSize',7,'Padding','replicate') - mu.*mu));
imnorm = (ipImage-mu)./(sigma+1);

我对方差、sigma的计算感到困惑。在论文的算法中,在每个像素处,计算 7x7 邻域的平均值,然后从所述 7x7 邻域的每个值中减去。然后,将差异平方并乘以其对应的高斯权重 w(k,l)

相反,MATLAB 算法将高斯加权(通过使用 imgausssfilt)与平方像素值相乘,然后从该矩阵中减去平方均值,取该操作的绝对值。如果我错了请纠正我,但是这不是错误使用 (a-b)² = a² - b² 的情况吗?

基本上我的问题是你能否确认我之前所说的是否属实,或者我误解了 MATLAB 代码。提前致谢!

我明白你为什么感到困惑,但两者都是对的。它使用经典身份

Var(X) = E [(X-E(X))^2]= E(X^2) - E(X)^2

只需将你的 (I-mu)^2 相乘并将结果与​​ mu 的定义进行比较,然后你会发现它们抵消了。