【问题标题】:Calculate MSE of two images计算两个图像的 MSE
【发布时间】:2013-11-17 09:52:04
【问题描述】:

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

在此先感谢

【问题讨论】:

  • 你得到了什么确切的运行时错误?在“double sse ...”这一行上,您假设所有图像都有 3 个通道,而在下一行,您将获得 I1.channels()。也许你应该像这样在第一行添加一个断言: I1.channels() == I2.channels() && I1.channels() == 3

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


【解决方案1】:

是的,图片大小必须相同。如果它们的大小不同,absdiff 如何进行元素减法? getMSE() 应该检查 I1I2 的大小是否相同,如果它们没有引发异常或以某种方式使它们的大小相同(例如,通过填充或 resize())。

例如:

 Mat I2_resized;
 resize(I2, I2_resized, I1.size());
 absdiff(I1, I2_resized, s1);
 ...

您的代码改编自 an OpenCV tutotial - 它看起来对我来说是正确的,所以请确保图像具有相同的大小。

【讨论】:

  • 请告诉我如何调整大小以使两个图像的尺寸相同?
【解决方案2】:

使用 python 我们可以计算两个图像的 MSE。

为此首先导入numpy库,然后取两个图像img1,img2并使用下面的代码打印结果

代码=>

import numpy as np
Y = np.square(np.subtract(img1,img1)).mean()
print("MSE:", Y)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多