计算两个图像的MSE

时间:2013-11-17 09:52:05

标签: c++ visual-studio-2010 opencv

我正在尝试使用以下代码计算两个图像的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说我有一个运行时错误,至少可以说是含糊不清的!

非常感谢提前

2 个答案:

答案 0 :(得分:3)

是的,图片尺寸必须相同。如果它们的大小不同,那么absdiff如何进行元素减法? getMSE()应检查I1I2是否大小相同,如果它们没有引发异常或以某种方式使它们大小相同(例如通过填充或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)