/// <summary> /// Get the quality in one of the components(Y/Cb/Cr) /// </summary> /// <param name="valueRef">component value of reference image</param> /// <param name="valueDis">component value of distorted image</param> /// <returns>quality</returns> private double GetComponentQuality(double[,] valueRef, double[,] valueDis) { double quality = 1; for (int scaleLevel = 1; scaleLevel <= MaxScaleLevel; scaleLevel++) { if (scaleLevel != 1) { valueRef = Downscaler.DownscaleByFactor(valueRef, 2); valueDis = Downscaler.DownscaleByFactor(valueDis, 2); } SsimParameters ssimParams = new SsimParameters(WindowWidth, WindowHeight, C1, C2, C3, Alpha[scaleLevel], Beta[scaleLevel], Gamma[scaleLevel]); quality *= new SsimCalculator(ssimParams).CalcMeanSsim(valueRef, valueDis); } return(quality); }
/// <summary> /// Get the quality in one of the component(Y/Cb/Cr) /// </summary> /// <param name="valueRef">component value of reference image</param> /// <param name="valueDis">component value of distorted image</param> /// <returns>quality</returns> private double GetComponentQuality(double[,] valueRef, double[,] valueDis) { double quality = 1; for (int scaleLevel = 1; scaleLevel <= MaxScaleLevel; scaleLevel++) { if (scaleLevel != 1) { valueRef = Downscaler.DownscaleByFactor(valueRef, 2); valueDis = Downscaler.DownscaleByFactor(valueDis, 2); } SsimParameters ssimParams = new SsimParameters(WindowWidth, WindowHeight, C1, C2, C3, Alphas[scaleLevel], Betas[scaleLevel], Gammas[scaleLevel]); double intermediateQuality = new SsimCalculator(ssimParams).CalcMeanSsim(valueRef, valueDis); // make sure when the image is downscaled to less then 8x8 it can get a meaningful result. if (!Double.Equals(intermediateQuality, 0.0)) { quality *= intermediateQuality; } } return(quality); }