File size: 2,296 Bytes
cec5823
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import json
import matplotlib.pyplot as plt
import numpy as np
from pathlib import Path
import pandas as pd


def snr_to_sigma(snr):
    return 10**(-snr/20.)*255.


def sigma_to_snr(sigma):
    return -20.*np.log10(sigma/255.)


def plot_results(selected_paths, title=None, diff=True, ylim=None):
    # plt.figure(figsize=(10, 10))
    all_stats = {}
    fig, ax = plt.subplots(layout='constrained', figsize=(10, 10))
    for selected_path, selected_regex in selected_paths:
        selected_path = Path(selected_path)
        assert selected_path.exists()
        results_path = sorted(list(selected_path.glob(selected_regex)))
        stats = []
        for result_path in results_path:
            df = pd.read_csv(result_path)
            in_psnr = df["in_PSNR"].mean()
            out_psnr = df["out_PSNR"].mean()
            out_ssim = df["out_SSIM"].mean()
            noise_stddev = np.array([
                float(el.replace("}", "").split(":")[1]) for el in df["degradation"]]).mean()
            stats.append({
                # "label": label,
                "in_psnr": in_psnr,
                "out_psnr": out_psnr,
                "noise_stddev": noise_stddev,
                "ssim": out_ssim
            })
            label = selected_path.name + " " + df["size"][0]
        
        stats_array = pd.DataFrame(stats)
        all_stats[label] = stats_array
        x_data = stats_array["in_psnr"].copy()
        x_data = snr_to_sigma(x_data)

        ax.plot(
            x_data,
            stats_array["out_psnr"]-stats_array["in_psnr"] if diff else stats_array["out_psnr"],
            "-o",
            label=label
        )
        # label=selected_path.name)
    if not diff:
        neutral_sigma = np.linspace(1, 80, 80)
        ax.plot(neutral_sigma, sigma_to_snr(neutral_sigma), "k--", alpha=0.1, label="Neutral")
    secax = ax.secondary_xaxis('top', functions=(sigma_to_snr, snr_to_sigma))
    secax.set_xlabel('PSNR [db]')

    ax.set_xlabel("sigma 255")
    ax.set_ylabel("PSNR improvement" if diff else "PSNR out")
    plt.xlim(1., 50.)
    if diff:
        plt.ylim(0, 15)
    else:
        if ylim is not None:
            plt.ylim(*ylim)
    if title is not None:
        plt.title(title)
    plt.legend()
    plt.grid()
    plt.show()

    return all_stats