Mean Squared Error
Full-Reference Quality Metrics
Also referred to as Mean Squared Deviation (MSD).
Description
The Mean Squared Error (MSE) measures the average squared difference between actual and ideal pixel values. It therefore compares an ideal reference image with an actual image.
Interpretation
When an image has no pixel differences (no errors), the MSE equals zero. As image differences increase, its value increases.
Limits
MSE is simple to calculate but might not align well with the human perception of quality.
Furthermore, the Mean Squared Error depends heavily on the scaling of the image intensity. A mean square error of 100.0 for an 8-bit image (with pixel values in the range 0-255) looks terrible; but an MSE of 100.0 for a 10-bit image (pixel values in the range [0,1023]) is hardly noticeable.
Only images showing the same scene should be compared.
Example
An image from a traffic surveillance camera in Germany is used to show the MSE results.
Reference Image

MSE of 2075.3

MSE of 917.8

Tools and Libraries
Python
In Python the package sewar contains multiple image quality metrics. One of them is the MSE.
Install package:
pip install sewar
Calculate MSE:
from sewar.full_ref import mse
import cv2
img_ref = cv2.imread('Reference_Image.png')
img_dark = cv2.imread('Image_Dark.png')
img_sun= cv2.imread('Image_Sunshine.png')
score_dark = mse(img_ref,img_dark)
print("Score of dark image", score_dark)
score_sun = mse(img_ref,img_sun)
print("Score of dark image", score_sun)
MATLAB
Within the MATLAB Image Processing Toolbox a function to calculate the MSE exists:
ref = imread('Reference_Image.png');
dark = imread('Image_Dark.png');
sun = imread('Image_Sunshine.png');
MSE_dark = immse(dark, ref);
fprintf('The mean-squared error for the dark image is %0.4f\n', MSE_dark);
MSE_sun = immse(sun, ref);
fprintf('The mean-squared error for the sun image is %0.4f\n', MSE_sun);
A detailed description can be found at the Mathworks Website. For an RGB image the MSE for each channel is calculated and the average of all channel MSEs is the MSE of the image. It is also possible to only calculate the MSE for one channel:
ref = imread('Reference_Image.png');
dark = imread('Image_Dark.png');
sun = imread('Image_Sunshine.png');
MSE_R = immse(dark(:,:,1), ref(:,:,1));
MSE_G = immse(dark(:,:,2), ref(:,:,2));
MSE_B = immse(dark(:,:,3), ref(:,:,3));
fprintf('\nThe mean-squared error for R-channel %0.4f\n', MSE_R);
fprintf('The mean-squared error for G-channel %0.4f\n', MSE_G);
fprintf('The mean-squared error for B-channel %0.4f\n', MSE_B);
If access to the MATLAB Image Processing Toolbox is denied, one can program the MSE by their own:
num_pixel = size(ref,1)*size(ref,2)*size(ref,3);
MSE = sum((double(ref) - double(dark)).^2,'all') / num_pixel;
fprintf('The mean-squared error for the dark image is %0.4f\n', MSE);
C++
OpenCV contains a class for calculating the MSE. A detailed description can be found in the OpenCV Docs:
#include <opencv2/quality/qualitymse.hpp>
#include <iostream>
int main()
{
std::string image_path = samples::findFile("Reference_Image.png");
cv::Mat img_ref = cv::imread(image_path, cv::IMREAD_COLOR);
std::string image_path = samples::findFile("Image_Dark.png");
cv::Mat img_dark = cv::imread(image_path, cv::IMREAD_COLOR);
cv::quality::QualityMSE::QualityMSE MSE_ref(img_ref);
cv::Scalar MSE;
MSE = MSE_ref.compute(img_dark);
}