超分辨率指标计算:Python代码用于评估图像质量,PSNR、SSIM、LPIPS和NIQE

本文主要是介绍超分辨率指标计算:Python代码用于评估图像质量,PSNR、SSIM、LPIPS和NIQE,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

整体目标与设计思想

整体目标

这个Python脚本主要用于评估图像质量,它比较了一组高清(HD)图像和对应的生成图像,并计算了四种不同的图像质量指标:PSNR、SSIM、LPIPS和NIQE。

设计思想

  1. 模块化: 代码通过函数进行模块化,每个函数负责一个特定任务,如计算PSNR或SSIM。
  2. 并行化: 使用多进程来加速图像处理,特别是在处理大量图像时。
  3. 可扩展性: 可以容易地添加更多的图像质量指标。
  4. 结果记录: 为每个高清图像生成一个详细的文本文件,记录与之相关的生成图像的所有质量指标。

功能模块解析

初始化LPIPS模型

在代码开始,使用了LPIPS库来初始化一个预训练的VGG网络,这用于后续的LPIPS图像质量评估。

loss_fn = lpips.LPIPS(net='vgg')

图像质量评估函数

calculate_psnr, calculate_ssim

这两个函数分别使用OpenCV和skimage库来计算PSNR和SSIM。这些都是全参考指标,需要原图和生成图进行比较。

calculate_lpips

这个函数使用初始化的LPIPS模型来评估两个图像(原图和生成图)之间的感知差异。

calculate_niqe

这个函数实现了NIQE(无参考图像质量评估),即只需要一个图像即可评估其质量。

主要的图像处理函数:process_image()

这个函数是代码的核心,它执行以下操作:

  1. 读取高清图像和生成图像: 使用OpenCV的cv2.imread方法。
  2. 初始化质量指标: 初始化用于存储最佳质量指标的变量。
  3. 计算并记录指标: 对于每个生成图像,计算所有的质量指标,并记录最佳值。
  4. 结果存储: 将计算的质量指标保存到一个文本文件。

并行处理

使用Python的multiprocessing.Pool来并行处理所有高清图像。这是一种典型的"Map-Reduce"模式,其中process_image函数是map操作。

with Pool(4) as pool:  # Initialize a pool with 4 processespool.starmap(process_image, [(i, main_output_file_path, hd_img_folder, generated_img_root_folder, output_root_folder) for i in range(1, 570)])

性能和优化

  1. IO操作: 由于代码涉及大量的文件读写(图像和文本),IO可能成为性能瓶颈。
  2. 并行优化: 使用多进程可以显著加速处理时间,但要注意不要超过系统的CPU核心数。

最佳实践与改进建议

  1. 配置文件或命令行参数: 硬编码(如路径和进程数)应避免,最好使用配置文件或命令行参数。
  2. 错误处理: 当前代码没有太多的错误处理,建议添加更多的异常捕获和错误检查。

代码

import os
from multiprocessing import Poolimport cv2
import lpips
import numpy as np
import torch
from scipy.ndimage import filters
from scipy.special import gammaln
from scipy.stats import genpareto
from skimage import img_as_float
from skimage.metrics import structural_similarity as compare_ssim
from tqdm import tqdm# Initialize LPIPS
loss_fn = lpips.LPIPS(net='vgg')def calculate_psnr(img1, img2):return cv2.PSNR(img1, img2)def calculate_ssim(img1, img2):return compare_ssim(img1, img2, multichannel=True)def calculate_lpips(img1, img2):img1 = torch.Tensor(img1).permute(2, 0, 1).unsqueeze(0)img2 = torch.Tensor(img2).permute(2, 0, 1).unsqueeze(0)return loss_fn(img1, img2).item()def calculate_niqe(image):image = img_as_float(image)h, w = image.shape[:2]block_size = 96strides = 32features = []for i in range(0, h - block_size + 1, strides):for j in range(0, w - block_size + 1, strides):block = image[i:i + block_size, j:j + block_size]mu = np.mean(block)sigma = np.std(block)filtered_block = filters.gaussian_filter(block, sigma)shape, _, scale = genpareto.fit(filtered_block.ravel(), floc=0)feature = [mu, sigma, shape, scale, gammaln(1 / shape)]features.append(feature)features = np.array(features)model_mean = np.zeros(features.shape[1])model_cov_inv = np.eye(features.shape[1])quality_scores = []for feature in features:score = (feature - model_mean) @ model_cov_inv @ (feature - model_mean).Tquality_scores.append(score)return np.mean(quality_scores)def process_image(i, main_output_file_path, hd_img_folder, generated_img_root_folder, output_root_folder):hd_img_name = f"{i}.png"hd_img_path = os.path.join(hd_img_folder, hd_img_name)hd_img = cv2.imread(hd_img_path)corresponding_generated_folder = os.path.join(generated_img_root_folder, str(i))if not os.path.exists(corresponding_generated_folder):print(f"Folder for {hd_img_name} does not exist. Skipping.")returnoutput_file_path = os.path.join(output_root_folder, f"{i}_output.txt")generated_img_names = os.listdir(corresponding_generated_folder)generated_img_names.sort(key=lambda x: int(x.split('.')[0]))total_images = len(generated_img_names)best_psnr = 0best_ssim = 0best_lpips = float('inf')best_niqe = float('inf')best_metrics_record = {}with open(output_file_path, 'w') as f:f.write(f"Results for HD Image: {hd_img_name}\n")f.write("-------------------------------------\n")for generated_img_name in tqdm(generated_img_names, total=total_images, desc=f"Processing for {hd_img_name}",leave=False):generated_img_path = os.path.join(corresponding_generated_folder, generated_img_name)generated_img = cv2.imread(generated_img_path)psnr = calculate_psnr(hd_img, generated_img)ssim = calculate_ssim(hd_img, generated_img)lpips_value = calculate_lpips(hd_img, generated_img)niqe = calculate_niqe(generated_img)result_line = f"{generated_img_name} PSNR: {psnr} SSIM: {ssim} LPIPS: {lpips_value} NIQE: {niqe}\n"f.write(result_line)if psnr > best_psnr:best_psnr = psnrbest_metrics_record['Best PSNR'] = (generated_img_name, best_psnr)if ssim > best_ssim:best_ssim = ssimbest_metrics_record['Best SSIM'] = (generated_img_name, best_ssim)if lpips_value < best_lpips:best_lpips = lpips_valuebest_metrics_record['Best LPIPS'] = (generated_img_name, best_lpips)if niqe < best_niqe:best_niqe = niqebest_metrics_record['Best NIQE'] = (generated_img_name, best_niqe)with open(main_output_file_path, 'a') as main_f:main_f.write(f"Best Metrics for {hd_img_name}\n")main_f.write("-------------------------------------\n")for metric, (img_name, value) in best_metrics_record.items():main_f.write(f"{metric}: {img_name}, Value: {value}\n")main_f.write("\n")print(f"Best Metrics for {hd_img_name} are saved in {main_output_file_path}")if __name__ == "__main__":hd_img_folder = 'xxxxxxx'generated_img_root_folder = 'xxxxxxx'output_root_folder = 'xxxxxxx'main_output_file_path = os.path.join(output_root_folder, "all_results.txt")with open(main_output_file_path, 'w') as main_f:main_f.write("Detailed Results for Each High-Definition Image\n")main_f.write("==============================================\n")with Pool(4) as pool:  # Initialize a pool with 8 processespool.starmap(process_image,[(i, main_output_file_path, hd_img_folder, generated_img_root_folder, output_root_folder) for i inrange(1, 570)])  # Parallel processing

这篇关于超分辨率指标计算:Python代码用于评估图像质量,PSNR、SSIM、LPIPS和NIQE的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/381

相关文章

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学