Commit a830ab45 authored by narugo1992's avatar narugo1992
Browse files

dev(narugo): psnr examples

parent 7999ff9f
Loading
Loading
Loading
Loading
+3.04 MiB
Loading image diff...
+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)
    )
+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
@@ -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))