zoukankan      html  css  js  c++  java
  • Image quality evaluation

    Generally,we use PSNR and SSIM to judge the quality of a given photo,or to select a useful denoising algorithm.

    I.PSNR(peak signal to noise ratio)

    double PSNR(const Mat&I, const Mat&K)
    {
    int w = I.size().width;
    int h = I.size().height;

    double MSE = 0.0;
    for (int i = 0; i<w; ++i)
    for (int j = 0; j<h; ++j)
    MSE += (I.at<uchar>(j, i) - K.at<uchar>(j, i))*(I.at<uchar>(j, i) - K.at<uchar>(j, i));
    MSE /= (w*h);

    double psnr = 10 * log10(255 * 255 / MSE);

    return psnr;
    }

    II.SSIM(structural similarity)

    double SSIM(const Mat& x, const Mat& y) {
    double meanX = pictureMean(x);
    double meanY = pictureMean(y);
    double sigmaX = pictureSigma(x,meanX);
    double sigmaY = pictureSigma(y, meanY);
    double sigmaXY = pictureCovSigma(x,y,meanX,meanY);

    double k1 = 0.01;
    double k2 = 0.03;
    double L = 255;
    double C1 = (k1*L)*(k1*L);
    double C2 = (k2*L)*(k2*L);
    double C3 = C2 / 2;

    double l = (2*meanX*meanY+C1) / (meanX*meanX+meanY*meanY+C1);
    double c = (2*sigmaX*sigmaY) / (sigmaX*sigmaX+sigmaY*sigmaY+C2);
    double s = (sigmaXY+C3) / (sigmaX*sigmaY+C3);

    double ssim = l*c*s;

    return ssim;
    }

    assistant functions:

    double pictureMean(const Mat& in) {
    int w = in.size().width;
    int h = in.size().height;

    double mean = 0.0;
    for (int i = 0; i<w; ++i)
    for (int j = 0; j<h; ++j)
    mean += (double)in.at<uchar>(j, i);
    mean =mean/(double)(w*h);

    return mean;
    }

    double pictureSigma(const Mat& in, double mean) {
    int w = in.size().width;
    int h = in.size().height;

    double sigma = 0.0;
    for (int i = 0; i<w; ++i)
    for (int j = 0; j<h; ++j)
    sigma += ((double)in.at<uchar>(j, i)-mean)*((double)in.at<uchar>(j, i) - mean);
    sigma = sigma / (double)(w*h-1);
    sigma = sqrt(sigma);

    return sigma;
    }

    double pictureCovSigma(const Mat& x, const Mat& y, double meanX, double meanY) {
    int w = x.size().width;
    int h = x.size().height;

    double sigma = 0.0;
    for (int i = 0; i<w; ++i)
    for (int j = 0; j<h; ++j)
    sigma += ((double)x.at<uchar>(j, i) - meanX)*((double)y.at<uchar>(j, i) - meanY);
    sigma = sigma / (double)(w*h - 1);

    return sigma;
    }

  • 相关阅读:
    16-pymysql模块的使用
    15-可视化工具Navicat的使用
    14-补充内容:MySQl创建用户和授权
    13-多表查询
    12-单表查询
    11-数据的增删改
    springboot整合thumbnailator实现图片压缩
    centos7下使用yum安装redis
    springboot以jar包方式启动、关闭、重启脚本
    centos7-每天定时备份 mysql数据库
  • 原文地址:https://www.cnblogs.com/ssMellon/p/6618100.html
Copyright © 2011-2022 走看看