视频质量评价python,包括psnr,ssim,LPIPS

文件准备:

创建两个文件夹,分别叫做video_gen,video_real。

video_gen下放置生成的视频的帧,以1.jpg样式命名。

video_real下放置真值,命名方式同上。

评价代码:

"""
Video Quality Metrics
Copyright (c) 2014 Alex Izvorski <aizvorski@gmail.com>

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""
import os
# time:2023.10.14 9:12
# author: Yuanping
# 注意修改main中的图片格式,如jpg还是png等
# 评估很多帧图片psnr并计算平局值的函数,只需改变gen_path和real_path就行,或者将相应jpg格式图片放入相应文件夹即可
# 最好都是相同命名,且gen的数量得小于等于real
# 会自动将评估得到的值存入csv,包括每一帧的和平均值
# 不需要计算某个值可以在video_quality函数中把计算某个值的过程注释掉
from glob import glob

import lpips
from skimage.metrics import structural_similarity as ssim
import cv2
import numpy
import math

import numpy as np
import pandas as pd


def psnr(img1, img2):
    mse = numpy.mean((img1 - img2) ** 2)
    if mse == 0:
        print("error:mse=0")
        exit(1)
        # return 0
    PIXEL_MAX = 255.0
    return 20 * math.log10(PIXEL_MAX / math.sqrt(mse))


def cal_psnr(gen_path, real_path):
    psnr_list = []
    for i in range(len(gen_path)):
        gen_pic = cv2.imread(gen_path[i])
        real_pic = cv2.imread(real_path[i])
        print("frame picture:")
        psnr_value = psnr(gen_pic, real_pic)
        print(i, " frame psnr: ", psnr_value)
        psnr_list.append([i, psnr_value])
    psnr_csv = pd.DataFrame(psnr_list, columns=['frame', 'psnr_value'])
    # psnr_csv = psnr_csv._append({'frame': 'average', 'psnr_value': psnr_csv["psnr_value"].mean()}, ignore_index=True)
    # psnr_csv.to_csv('video_psnr.csv', index=False)
    return psnr_csv


def cal_ssim(gen_path, real_path, quality_df):
    ssim_list = []
    for i in range(len(gen_path)):
        gen_pic = cv2.imread(gen_path[i])
        real_pic = cv2.imread(real_path[i])
        ssim_value = ssim(gen_pic, real_pic, channel_axis=-1)
        print(i, " frame ssim: ", ssim_value)
        ssim_list.append(ssim_value)
    quality_df['ssim_value'] = ssim_list
    return quality_df


def cal_LPIPS(gen_path, real_path, quality_df):
    """
    参考代码:https://blog.csdn.net/weixin_43135178/article/details/127664187
    """
    ## Initializing the model
    loss_fn = lpips.LPIPS(net='alex', version=0.1)  # pip install lpips
    lpips_list = []
    for i in range(len(gen_path)):
        try:
            # Load images
            img0 = lpips.im2tensor(lpips.load_image(gen_path[i]))
            img1 = lpips.im2tensor(lpips.load_image(real_path[i]))
            # Compute distance,之所以会有后面detach和numpy是因为要把梯度去掉,这样才能加到dataframe里面
            # 之所以还有个mean函数,是因为不加mean的话得到的是[[[value]]],加了mean可以直接得到值
            current_lpips_distance = loss_fn.forward(img0, img1).detach().numpy().mean()
            print(i, " frame lpips: ", current_lpips_distance)
            lpips_list.append(current_lpips_distance)
        except Exception as e:
            print(e)
    quality_df['lpips_value'] = lpips_list
    return quality_df


def video_quality(gen_path, real_path):
    quality_df = cal_psnr(gen_path, real_path)
    quality_df = cal_ssim(gen_path, real_path, quality_df)
    quality_df = cal_LPIPS(gen_path, real_path, quality_df)
    quality_df = quality_df._append({'frame': 'average',
                                     'ssim_value': quality_df["ssim_value"].mean(),
                                    'psnr_value': quality_df["psnr_value"].mean(),
                                     'lpips_value': quality_df["lpips_value"].mean()},
                                    ignore_index=True)
    quality_df.to_csv('video_quality.csv', index=False)


if __name__ == '__main__':
    gen_path = glob("video_gen/*.jpg")
    real_path = glob("video_real/*.jpg")
    video_quality(gen_path, real_path)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PSNR(峰值信噪比)和SSIM(结构相似性)是图像质量评价的两个重要指标。 PSNR是一种用于度量图像质量的指标,通过计算原始图像与经过压缩或处理后的图像之间的峰值信噪比来评估图像的失真程度。峰值信噪比是指信号的最大可能功率与表示这个信号的系统的噪声功率之比。PSNR的计算公式为: PSNR = 10 * log10((最大可能像素值)² / MSE) 其中最大可能像素值是指原始图像中像素的最大值,MSE是均方差,用于度量两个图像之间的差异程度。 SSIM是一种统计方法,用于比较两个图像的结构相似性。它不仅考虑图像的亮度信息,还考虑图像的对比度和结构信息。SSIM计算过程中引入了三个关键的组成部分:亮度相似性、对比度相似性和结构相似性。SSIM的计算公式为: SSIM(x, y) =(2μxμy + C1)(2σxy + C2)/(μx² + μy² + C1)(σx² + σy² + C2) 其中,x和y分别代表两个图像,μx和μy分别代表x和y的平均值,σx²和σy²分别代表x和y的方差,σxy代表x和y的协方差,C1和C2是常数用来稳定计算。 PSNRSSIM是常用的图像质量评价指标。PSNR主要用于比较两个图像之间的失真程度,数值越大表示失真越小;而SSIM主要用于比较两个图像之间的结构相似性,数值越接近1表示结构相似性越高。综合应用这两个指标可以更全面地评价图像质量。 ### 回答2: PSNR(Peak Signal-to-Noise Ratio)是一种用于评估图像质量的指标,它通过比较原始图像与经过压缩或失真处理后的图像之间的均方误差,来衡量图像的失真程度。PSNR的计算公式为: PSNR = 10 * log10 (MAX^2 / MSE) 其中 MAX 表示像素数据的最大可能取值,MSE 表示均方误差,即原始图像与失真图像之间每个像素值差的平方的均值。PSNR的值通常以分贝(dB)为单位,数值越大表示图像质量越好。 而 SSIM(Structural Similarity Index)是一种比较图像结构相似性的指标,它主要关注图像的亮度、对比度和结构等方面。SSIM的计算公式为: SSIM = (2 * μx * μy + C1) * (2 * σxy + C2) / (μx^2 + μy^2 + C1) * (σx^2 + σy^2 + C2) 其中 μx 和 μy 表示原始图像和失真图像的亮度平均值,σx 和 σy 表示原始图像和失真图像的方差,σxy 表示原始图像和失真图像的协方差,C1 和 C2 是常数,用于避免分母为零。SSIM的取值范围为[-1, 1],值越接近1表示图像质量越好。 PSNRSSIM是两种常用的图像质量评价指标。PSNR主要关注图像的失真程度,适用于需要精确度和灵敏度的场景;而SSIM则关注图像的结构相似性,适用于需要保留图像细节和结构的场景。综合使用PSNRSSIM可以更全面地评价图像的质量。 ### 回答3: 图像质量评价指标是衡量图像质量好坏的方法,其中PSNRSSIM是两个常用的评价指标。 PSNR(Peak Signal-to-Noise Ratio)是一种用于测量图像失真程度的指标。它计算图像与原始图像之间的峰值信噪比,即原始图像中最大像素值与重建图像与原始图像之间的均方误差的比值。PSNR值越高,表示失真越小,图像质量越好。常用PSNR评价图像压缩算法的效果,如JPEG压缩等。 SSIM(Structural Similarity Index)是一种用于测量图像结构相似性的指标。它考虑了亮度、对比度和结构三个因素间的差异,并综合这些因素计算相似性指数。SSIM值越接近1,表示两幅图像越相似,图像质量越好。SSIM主要用于评价图像处理算法的效果,如去噪、增强等。 PSNRSSIM都是客观评价指标,对失真图像与原始图像之间的差异进行量化。它们都有各自的使用范围和场景,没有绝对优劣之分。在评价图像质量时,可以综合考虑PSNRSSIM,以及其他评价指标,综合评估图像的视觉感知质量。 需要注意的是,PSNRSSIM仅能从一定程度上反映图像质量,对于某些特殊场景或者人眼难以察觉的差异可能会存在局限性。因此,在实际应用中,还需要结合人眼主观评价、其他更多的评价指标以及具体的应用需求来全面评价图像的质量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值