psnr和ssim指标是图像处理方面两个比较重要的参考指标,很常见。
先说一个普遍性的问题,如果你计算psnr和ssim的代码中有“from skimage.measure import compare_ssim, compare_psnr”,大概率会报错,因为compare_ssim, compare_psnr这两个是旧版的,现在已经不用了,如果想顺利跑通代码,且不改变代码本体中的compare_ssim, compare_psnr这两个指标的,那你只需要在原本的代码
from skimage.measure import compare_ssim, compare_psnr
改成以下两句
from skimage.metrics import structural_similarity as ssim
from skimage.metrics import peak_signal_noise_ratio as compare_psnr
最后,以windows系统为例,我在桌面创建了一个test和一个clear文件夹,给大家一份完整的计算两个文件夹中图片的psnr和ssim指标代码,仅需要在末尾改变你的图像路径即可。
这个代码可以显示每对应得图像之间的psnr和ssim,也可以显示两个文件夹的psnr和ssim的平均值
import cv2
import os
import numpy as np
from skimage.metrics import structural_similarity as ssim
from skimage.metrics import peak_signal_noise_ratio as compare_psnr
def compare_images(folder1, folder2):
psnrs = []
ssims = []
# 获取第一个文件夹中的所有图片文件
images1 = [f for f in os.listdir(folder1) if f.lower().endswith(('.png', '.jpg', '.jpeg'))]
images2 = [f for f in os.listdir(folder2) if f.lower().endswith(('.png', '.jpg', '.jpeg'))]
# 确保两个文件夹中的图片数量相同
assert len(images1) == len(images2), "两个文件夹中的图片数量必须相同"
for img1, img2 in zip(images1, images2):
# 读取图片
img1_path = os.path.join(folder1, img1)
img2_path = os.path.join(folder2, img2)
# 使用cv2读取图片
img1 = cv2.imread(img1_path)
img2 = cv2.imread(img2_path)
# 确保图片尺寸相同
assert img1.shape == img2.shape, "图片尺寸必须相同"
# 将图片转换为浮点型以计算SSIM
img1 = img1.astype(np.float64) / 255.0
img2 = img2.astype(np.float64) / 255.0
# 计算PSNR和SSIM
psnr_value = compare_psnr(img1, img2, data_range=1)
ssim_value = ssim(img1, img2, multichannel=True)
psnrs.append(psnr_value)
ssims.append(ssim_value)
return psnrs, ssims
# 指定两个文件夹的路径
folder1 = 'C:/Users/shengli/Desktop/test/'
folder2 = 'C:/Users/shengli/Desktop/clear/'
# 计算PSNR和SSIM
psnrs, ssims = compare_images(folder1, folder2)
# 打印每张图片的PSNR和SSIM
for psnr, ssim in zip(psnrs, ssims):
print(f"PSNR: {psnr:.4f}, SSIM: {ssim:.4f}")
# 计算并打印PSNR和SSIM的平均值
average_psnr = np.mean(psnrs)
average_ssim = np.mean(ssims)
print(f"Average PSNR: {average_psnr:.4f}")
print(f"Average SSIM: {average_ssim:.4f}")
我的两个文件夹中各有三张图片,所以在pycharm终端会显示以下结果:
以上代码使用有几个注意事项
第一点,两个文件夹中的每张对应的图片像素大小要一致,linux系统上运行代码要注意路径斜杠与反斜杠的表达。希望能帮助到你。