|
import os
|
|
import cv2
|
|
import numpy as np
|
|
import random
|
|
from skimage.metrics import peak_signal_noise_ratio as compare_psnr
|
|
from skimage.metrics import mean_squared_error as compare_mse
|
|
from skimage.metrics import structural_similarity as compare_ssim
|
|
|
|
from tqdm import tqdm
|
|
import pandas as pd
|
|
|
|
def calculate_psnr_ssim_with_progress(clear_folder, methods, degradation_types, win_size=7):
|
|
|
|
img_list = [img for img in os.listdir(clear_folder) if img.endswith('.png')]
|
|
|
|
|
|
psnr_matrix = np.zeros((len(methods), len(degradation_types)))
|
|
ssim_matrix = np.zeros((len(methods), len(degradation_types)))
|
|
|
|
|
|
total_tasks = len(methods) * len(degradation_types) * len(img_list)
|
|
print(len(methods), len(degradation_types), len(img_list))
|
|
|
|
|
|
with tqdm(total=total_tasks, desc="Processing Images", unit="task") as pbar:
|
|
|
|
for k, method in enumerate(methods):
|
|
print(f"Processing method: {method}")
|
|
|
|
|
|
for j, degradation_type in enumerate(degradation_types):
|
|
psnr_values = []
|
|
ssim_values = []
|
|
|
|
|
|
for img_name in img_list:
|
|
clear_img_path = os.path.join(clear_folder, img_name)
|
|
degraded_img_path = f'./{method}/{degradation_type}/{img_name}'
|
|
|
|
|
|
clear_img = cv2.imread(clear_img_path) / 255.0
|
|
degraded_img = cv2.imread(degraded_img_path) / 255.0
|
|
|
|
|
|
if clear_img is not None and degraded_img is not None:
|
|
|
|
psnr_value = compare_psnr(clear_img, degraded_img, data_range=1.0)
|
|
|
|
|
|
ssim_value = compare_ssim(clear_img, degraded_img, multichannel=True,
|
|
win_size=min(win_size, clear_img.shape[0], clear_img.shape[1]),
|
|
channel_axis=-1, data_range=1.0)
|
|
|
|
|
|
psnr_values.append(psnr_value)
|
|
ssim_values.append(ssim_value)
|
|
|
|
|
|
pbar.update(1)
|
|
|
|
|
|
if psnr_values:
|
|
psnr_matrix[k, j] = np.mean(psnr_values)
|
|
if ssim_values:
|
|
ssim_matrix[k, j] = np.mean(ssim_values)
|
|
|
|
return psnr_matrix, ssim_matrix
|
|
|
|
def save_matrices_to_excel(psnr_matrix, ssim_matrix, methods, degradation_types, output_file='metrics.xlsx'):
|
|
|
|
psnr_df = pd.DataFrame(psnr_matrix, index=methods, columns=degradation_types)
|
|
ssim_df = pd.DataFrame(ssim_matrix, index=methods, columns=degradation_types)
|
|
|
|
|
|
with pd.ExcelWriter(output_file) as writer:
|
|
psnr_df.to_excel(writer, sheet_name='PSNR')
|
|
ssim_df.to_excel(writer, sheet_name='SSIM')
|
|
|
|
print(f'Matrices saved to {output_file}')
|
|
|
|
|
|
clear_folder = './00_gt'
|
|
methods = ['01_input', '02_MIRNet', '03_MPRNet', '04_MIRNetv2', '05_Restormer',
|
|
'06_DGUNet', '07_NAFNet', '08_SRUDC', '09_Fourmer', '10_OKNet', '11_AirNet',
|
|
'12_TransWeather', '13_WeatherDiff', '14_PromptIR', '15_WGWSNet', '16_OneRestore_visual', '17_OneRestore']
|
|
degradation_types = ['low', 'haze', 'rain', 'snow', 'low_haze', 'low_rain', 'low_snow', 'haze_rain', 'haze_snow', 'low_haze_rain', 'low_haze_snow']
|
|
|
|
|
|
|
|
|
|
|
|
psnr_matrix, ssim_matrix = calculate_psnr_ssim_with_progress(clear_folder, methods, degradation_types)
|
|
save_matrices_to_excel(psnr_matrix, ssim_matrix, methods, degradation_types)
|
|
|
|
|
|
|
|
|