#include<iostream>
using namespace std;
#include<opencv2/opencv.hpp>
#include<vector>
using namespace cv;
//均方误差法图像质量评价(越大越差)
void Mse(Mat& src1, Mat& src2)
{
double sum,sum1=0;
int k = src1.rows * src2.cols;
for (int i = 0; i < src1.rows; i++)
{
uchar* image1 = src1.ptr(i);
uchar* image2 = src2.ptr(i);
for (int j = 0; j < src1.cols; j++)
{
sum=pow((image1[j] - image2[j]), 2);
sum1 += sum;
}
}
double mse = sum1 / k;
cout << mse << endl;
}
//峰值信噪比图像质量评价(越小越差)
void PSNR(Mat& src1, Mat& src2)
{
double sum, sum1 = 0;
int k = src1.rows * src2.cols;
for (int i = 0; i < src1.rows; i++)
{
uchar* image1 = src1.ptr(i);
uchar* image2 = src2.ptr(i);
for (int j = 0; j < src1.cols; j++)
{
sum = pow((image1[j] - image2[j]), 2);
sum1 += sum;
}
}
double mse = sum1 / k;
double l = pow(255, 2);
double psnr = 10 * log10(l / mse);
cout << mse << endl;
cout << psnr << endl;
}
int main()
{
Mat src = imread("D:\\VC\\c++\\opencv源码\\opencv源码\\6.jpg",IMREAD_GRAYSCALE);//读入图像
Mat src1 = imread("D:\\VC\\c++\\opencv源码\\opencv源码\\7.jpg",IMREAD_GRAYSCALE);//读入图像
//判断是否为灰度图
if (src.channels() == 1 || src.channels() == 1)
{
Mse(src, src1);
PSNR(src, src1);
}
else
{
cout << "您输入的图片不是灰度图" << endl;
}
system("pause");
return 0;
}