Loading docs/source/api_doc/metrics/psnr/origin.jpg 0 → 100644 +3.04 MiB Loading image diff... docs/source/api_doc/metrics/psnr_plot.demo.py 0 → 100644 +41 −0 Original line number Diff line number Diff line import random import numpy as np from PIL import Image from plot import image_plot ORIGIN_FILENAME = 'psnr/origin.jpg' def gaussian_noise(scale=20): random.seed(0) img = Image.open(ORIGIN_FILENAME).convert('RGB') img_arr = np.array(img) noise = np.random.normal(0, scale, img_arr.shape) noisy_arr = img_arr + noise noisy_img = Image.fromarray(noisy_arr.astype('uint8'), mode='RGB') export_file = f'psnr/gaussian_{scale}.dat.jpg' noisy_img.save(export_file) return export_file def low_quality(): random.seed(0) img = Image.open(ORIGIN_FILENAME).convert('RGB') export_file = 'psnr/lq.dat.jpg' img.save(export_file, quality=5) return export_file if __name__ == '__main__': image_plot( ORIGIN_FILENAME, gaussian_noise(20), gaussian_noise(3), low_quality(), save_as='psnr.dat.svg', columns=2, figsize=(6, 5) ) imgutils/metrics/psnr_.py +29 −0 Original line number Diff line number Diff line """ Overview: Implementation of `PSNR <https://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio>`_ metrics. """ import numpy as np from ..data import rgb_encode Loading @@ -8,6 +12,31 @@ __all__ = [ def psnr(img1, img2) -> float: """ Overview: Psnr difference between images. :param img1: First image. :param img2: Second image. :return: Psnr difference of these two images. Example: Here are some images for example .. image:: psnr.dat.svg :align: center >>> from imgutils.metrics import psnr >>> >>> psnr('psnr/origin.jpg', 'psnr/origin.jpg') # same image inf >>> psnr('psnr/origin.jpg', 'psnr/gaussian_20.dat.jpg') 15.058228614646987 >>> psnr('psnr/origin.jpg', 'psnr/gaussian_3.dat.jpg') 27.65611098737784 >>> psnr('psnr/origin.jpg', 'psnr/lq.dat.jpg') 25.29589659377844 """ d1, d2 = rgb_encode(img1), rgb_encode(img2) mse = np.mean((d1 - d2) ** 2) return float(10 * np.log10(1. / mse)) Loading
docs/source/api_doc/metrics/psnr_plot.demo.py 0 → 100644 +41 −0 Original line number Diff line number Diff line import random import numpy as np from PIL import Image from plot import image_plot ORIGIN_FILENAME = 'psnr/origin.jpg' def gaussian_noise(scale=20): random.seed(0) img = Image.open(ORIGIN_FILENAME).convert('RGB') img_arr = np.array(img) noise = np.random.normal(0, scale, img_arr.shape) noisy_arr = img_arr + noise noisy_img = Image.fromarray(noisy_arr.astype('uint8'), mode='RGB') export_file = f'psnr/gaussian_{scale}.dat.jpg' noisy_img.save(export_file) return export_file def low_quality(): random.seed(0) img = Image.open(ORIGIN_FILENAME).convert('RGB') export_file = 'psnr/lq.dat.jpg' img.save(export_file, quality=5) return export_file if __name__ == '__main__': image_plot( ORIGIN_FILENAME, gaussian_noise(20), gaussian_noise(3), low_quality(), save_as='psnr.dat.svg', columns=2, figsize=(6, 5) )
imgutils/metrics/psnr_.py +29 −0 Original line number Diff line number Diff line """ Overview: Implementation of `PSNR <https://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio>`_ metrics. """ import numpy as np from ..data import rgb_encode Loading @@ -8,6 +12,31 @@ __all__ = [ def psnr(img1, img2) -> float: """ Overview: Psnr difference between images. :param img1: First image. :param img2: Second image. :return: Psnr difference of these two images. Example: Here are some images for example .. image:: psnr.dat.svg :align: center >>> from imgutils.metrics import psnr >>> >>> psnr('psnr/origin.jpg', 'psnr/origin.jpg') # same image inf >>> psnr('psnr/origin.jpg', 'psnr/gaussian_20.dat.jpg') 15.058228614646987 >>> psnr('psnr/origin.jpg', 'psnr/gaussian_3.dat.jpg') 27.65611098737784 >>> psnr('psnr/origin.jpg', 'psnr/lq.dat.jpg') 25.29589659377844 """ d1, d2 = rgb_encode(img1), rgb_encode(img2) mse = np.mean((d1 - d2) ** 2) return float(10 * np.log10(1. / mse))