我正在尝试使用以下代码计算两个图像的MSE: -
void getMSE(const Mat& I1, const Mat& I2)
{
Mat s1;
absdiff(I1, I2, s1); // |I1 - I2|
s1.convertTo(s1, CV_32F); // cannot make a square on 8 bits
s1 = s1.mul(s1); // |I1 - I2|^2
Scalar s = sum(s1); // sum elements per channel
double sse = s.val[0] + s.val[1] + s.val[2]; // sum channels
double mse = sse / (double)(I1.channels() * I1.total());
printf("mse = %f", mse);
}
它没有成功运行,我想知道你们有没有想法?如果图像大小不同,此代码是否会运行? VS10说我有一个运行时错误,至少可以说是含糊不清的!
非常感谢提前
答案 0 :(得分:3)
是的,图片尺寸必须相同。如果它们的大小不同,那么absdiff
如何进行元素减法? getMSE()
应检查I1
和I2
是否大小相同,如果它们没有引发异常或以某种方式使它们大小相同(例如通过填充或resize()
)
e.g:
Mat I2_resized;
resize(I2, I2_resized, I1.size());
absdiff(I1, I2_resized, s1);
...
您的代码改编自an OpenCV tutotial - 它看起来对我来说,所以请确保图片大小相同。
答案 1 :(得分:0)
使用python我们可以计算两个图像的MSE。
对于此第一个导入numpy库,然后拍摄两个图像img1,img2并使用下面的代码打印结果
代码=>
import numpy as np
Y = np.square(np.subtract(img1,img1)).mean()
print("MSE:", Y)