图像质量评价指标计算python代码,PSNR,SSIM,fsim,niqe,lpips,rmse,德尔塔δe

图像质量评价指标计算python,PSNR,SSIM,fsim,niqe,lpips,rmse,德尔塔δe

import numpy as np
from skimage.metrics import structural_similarity as ssim
from skimage.metrics import peak_signal_noise_ratio as psnr
import os
import torch
import matplotlib.pyplot as plt
import cv2
from fsim import FSIM, FSIMc
from PIL import Image, ImageDraw, ImageFont
import Niqe
import lpips
from sklearn.metrics import mean_squared_error
from colormath.color_objects import LabColor
from colormath.color_diff import delta_e_cie1976
def cal_ssim_psnr(path1,path2):#一次性读一个文件夹img_low=os.listdir(path1)img_high=os.listdir(path2)cal_psnr=[]cal_ssim=[]for i in range(15):# print(path1+'/'+ img_low[i])img1 = cv2.imread(path1 +'/'+ img_low[i])img2 = cv2.imread(path2 +'/'+ img_high[i])cal_psnr.append(psnr(img1, img2))cal_ssim.append(ssim(img1, img2, channel_axis=2))return np.array(cal_psnr).mean(),np.array(cal_ssim).mean()def cal_fsim(path1,path2):#一次性读一个文件夹img_low = os.listdir(path1)img_high = os.listdir(path2)cal_fsim = []for i in range(15):bw = False# Size of the batch for trainingbatch_size = 1# Read reference and distorted imagesimg1 = Image.open(path1 +'/'+ img_low[i]).convert('RGB')img1 = torch.from_numpy(np.asarray(img1))img1 = img1.permute(2, 0, 1)img1 = img1.unsqueeze(0).type(torch.FloatTensor)img2 = torch.clamp(torch.rand(img1.size()) * 255.0, 0, 255.0)# Create fake batch (for testing)img1b = torch.cat(batch_size * [img1], 0)img2b = torch.cat(batch_size * [img2], 0)if torch.cuda.is_available():img1b = img1b.cuda()img2b = img2b.cuda()# Create FSIM lossFSIM_loss = FSIMc()loss = FSIM_loss(img1b, img2b)cal_fsim.append(loss)return np.array(cal_fsim).mean()def cal_niqe(path1,path2):#一次性读一个文件夹img_low = os.listdir(path1)img_high = os.listdir(path2)cal_niqe = []for i in range(15):ref = np.array(Image.open(path1 +'/'+ img_low[i]).convert('LA'))[:,:,0] # refcal_niqe.append(Niqe.niqe(ref))return np.array(cal_niqe).mean()def cal_lpips(path1,path2):#一次性读一个文件夹img_low = os.listdir(path1)img_high = os.listdir(path2)use_gpu = True         # Whether to use GPUspatial = True cal_lpips = []for i in range(15):loss_fn = lpips.LPIPS(net='alex', spatial=spatial)if(use_gpu):loss_fn.cuda()dummy_img0 = lpips.im2tensor(lpips.load_image(path1 +'/'+ img_low[i]))dummy_img1 = lpips.im2tensor(lpips.load_image(path2 +'/'+ img_low[i]))dummy_img0 = dummy_img0.cuda()dummy_img1 = dummy_img1.cuda()dist = loss_fn.forward(dummy_img0, dummy_img1)cal_lpips.append(dist.mean().item())return np.array(cal_lpips).mean()def cal_rmse(path1,path2):#一次性读一个文件夹img_low = os.listdir(path1)img_high = os.listdir(path2)cal_rmse = []for i in range(15):rms = mean_squared_error(path1 +'/'+ img_low[i], path1 +'/'+ img_high[i], squared=False)cal_rmse.append(rms)return np.array(cal_rmse).mean()def cal_deltae(path1,path2):#一次性读一个文件夹img_low = os.listdir(path1)img_high = os.listdir(path2)cal_deltae = []for i in range(15):deltae = skimage.color.deltaE_cie76(path1 +'/'+ img_low[i], path1 +'/'+ img_high[i])cal_deltae.append(deltae)return np.array(cal_deltae).mean()def pi(path1,path2):img_low = os.listdir(path1)img_high = os.listdir(path2)cal_pi = []for i in range(15):cal_pi.append(pi)return np.array(cal_pi).mean()def cal_all(path_high,path,txt_path):print('computing...')file = open(txt_path, 'w', encoding='utf-8')file_list=os.listdir(path)c_psnr=[]c_ssim=[]c_fsim=[]c_niqe=[]c_lpips=[]c_rmse=[]c_deltae=[]for i in file_list:print(i)a,b=cal_ssim_psnr(path+i,path_high)# c=cal_fsim(path+i,path_high)c=0d=cal_niqe(path+i,path_high)e=cal_lpips(path+i,path_high)f=cal_rmse(path+i,path_high)g=cal_deltae(path+i,path_high)c_psnr.append(a)c_ssim.append(b)c_fsim.append(c)c_niqe.append(d)c_lpips.append(e)c_rmse.append(f)c_deltae.append(g)print(i+' psnr:'+str(a)+'    '+'    '+' ssim:'+str(b)+'    '+'fsim: '+str(c)+'    '+' niqe:'+str(d)+'    '+'lpips: '+str(e)+'    '+' rmse:'+str(f)+'    '+'deltae: '+str(g)+'\n')file.close()
print('sss')
cal_all('G:/pjzb/picture/gt','G:/pjzb/picture/enhance/','G:/pjzb/out_data_outdoor01.txt')#文件放这
#其中:gt是一级文件夹,里面直接是不同的图片
#增强结果是二级文件夹,下一级是不同方法的文件夹,再下一级是不同的图片
#为什么每次循环是15:因为lol的test长度是15

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/722483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】第 387 场周赛

3069. 将元素分配到两个数组中 I 给你一个下标从 1 开始、包含 不同 整数的数组 nums ,数组长度为 n 。 你需要通过 n 次操作,将 nums 中的所有元素分配到两个数组 arr1 和 arr2 中。在第一次操作中,将 nums[1] 追加到 arr1 。在第二次操作…

SpringBoot之获取Spring容器上下文组件的工具类封装

SpringBoot之获取Spring容器上下文组件的工具类封装 文章目录 SpringBoot之获取Spring容器上下文组件的工具类封装1. SpringBoot版本2. Spring容器上下文工具类封装 如在一个普通类中获取HttpServletRequest、HttpServletResponse…等等以工具类的形式getBen,而不需要Component…

win11环境下使用hane WIN NFS Server搭建nfs服务

如题,服务端使用hane win nfs server,客户端也是使用wins系统。 S1,安装nfs服务器端,wins系列除了server系列可以使用nfs服务端,其余必须使用额外的组件来实现NFS文件系统的功能。 Networking Software for Windows …

系统学习Python——装饰器:直接管理函数和类

分类目录:《系统学习Python》总目录 在《系统学习Python——装饰器》系列文章中,我们的大多数示例都设计来拦截函数和实例创建调用。这对于装饰器来说很典型,但是它们并不限于这一角色。因为装饰器通过装饰器代码来运行新的函数和类&#xff…

Nodejs 第四十六章(redis持久化)

redis持久化 Redis提供两种持久化方式: RDB(Redis Database)持久化:RDB是一种快照的形式,它会将内存中的数据定期保存到磁盘上。可以通过配置Redis服务器,设置自动触发RDB快照的条件,比如在指…

C#进阶高级语法之LINQ:深入分析LINQ的查询表达式、延迟执行与PLINQ高级特性

LINQ(Language-Integrated Query)是.NET框架的一个强大的查询语言,它可以用来查询各种数据源,如集合、数据库等。LINQ提供了许多高级特性,包括LINQ查询表达式、deferred execution和PLINQ(并行LINQ&#xf…

力扣每日一题 用栈实现队列

Problem: 232. 用栈实现队列 文章目录 思路复杂度💖 朴素版💖 优化版 思路 👨‍🏫 路飞题解 复杂度 时间复杂度: 添加时间复杂度, 示例: O ( n ) O(n) O(n) 空间复杂度: 添加空间复杂度, 示例: O ( …

Linux系统的服务/进程

系统守护进程(服务) •服务就是运行在网络服务器上监听用户请求的进程 •服务是通过端口号来区分的 常见的服务及其对应的端口 1.ftp:21 FTP指的是文件传输协议,它是用于在计算机网络上进行文件传输的标准网络协议。通过FTP&am…

HTTP协议与HTTPS协议

HTTP协议 HTTP协议是一个无状态的协议, 服务器不维护任何有关客户端之前所发请求的消息。 是一种懒政,有状态协议就会更加复杂,需要维护状态(历史信息),要是客户或者服务器失效,会产生状态不一致(状态前后不对称),解决…

【Python 常用脚本及命令系列 2.4 -- int 将字符串数字转为数值】

文章目录 Python int() 函数python 将字符串数字转为数值type 函数使用 Python int() 函数 int() 函数用于将一个字符串或数字转换为整型。 以下是 int() 方法的语法: class int(x, base10)x – 字符串或数字。base – 进制数,默认十进制,如果是16进制…

C++对象内存模型布局详解

目录 本文主要内容如下: 最后还有一些问题: 一、理解虚函数表 二、对象模型概述 三、继承下的C对象模型 单继承: 多继承: 一般的多继承(非菱形继承): 菱形继承: 五、虚继承…

【牛客】VL64 时钟切换

描述 题目描述: 存在两个同步的倍频时钟clk0 clk1,已知clk0是clk1的二倍频,现在要设计一个切换电路,sel选择时候进行切换,要求没有毛刺。 信号示意图: 波形示意图: 输入描述: clk0 clk1为时…

第四十七天| 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

Leetcode 198.打家劫舍 题目链接:198 打家劫舍 题干:你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚…

12-Linux部署Zookeeper集群

Linux部署Zookeeper集群 简介 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。…

jmeter 压测数据库

当前版本: jmeter 5.6.3mysql 5.7.39 简介 JMeter 是一个开源的 Java 应用程序,主要用于进行性能测试和负载测试。它支持多种协议,包括但不限于 HTTP、HTTPS、FTP、JDBC 以及各种 Web Services。对于数据库的压力测试可以使用 JDBC 协议与数…

excel导入标准化

excel导入较导出还是复杂一些,一般分为三个步骤.市面上低代码平台可以将常用的操作固化,并且形成收益,这也是挺好的。我将我的一些总结分享到网上也是我自己乐意的。毕竟尊重技术的还是搞技术的自身,一般企业老板并不太关心技术代…

Spring中@import注解终极揭秘!

技术概念 它能干啥 Import注解在Spring框架中主要用于解决模块化和配置管理方面的技术问题,它可以帮助开发者实现以下几个目标: 模块化配置:在大型项目中,通常需要将配置信息分散到多个配置类中,以便更好地组织和管…

FPGA-DDS原理及实现

DDS(Direct Digital Synthesizer)即数字合成器,是一种新型的频率合成技术,具有相对带宽大,频率转换时间短、分辨率高和相位连续性好等优点。较容易实现频率、相位以及幅度的数控调制,广泛应用于通信领域。 相位累加器是由N位加法器与N位寄存器构成,每个时钟周期的上升沿,加法器…

数据中心制冷系统设计与发展

数据中心概要与传统建筑空间相比,数据中心散热密度大,单位面积散热量可达传统办公区域的40倍以上,且越来越呈现集中化、大型化的趋势;同时,设备的安全性需求提高了对内部空调温湿度和洁净度的要求,数据中心…

【Qt】Qwidget的常见属性

目录 一、Qwidget核心属性 二、enable属性 三、geometry属性 四、 WindowFrame的影响 五、windowTitle属性 六、windowIcon属性 七、qrc文件管理资源 八、windowOpacity属性 九、cursor属性 十、font属性 十一、toolTip属性 十二、focusPolicy属性 十三、styleShe…