批量计算两个文件夹的psnr和ssim指标,解决from skimage.measure import compare_ssim, compare_psnr报错问题

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系统上运行代码要注意路径斜杠与反斜杠的表达。希望能帮助到你。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]和\[2\]中提到的错误信息"ImportError: cannot import name 'compare_psnr' from 'skimage.measure'"表示在代码中导入skimage.measure模块的compare_psnr函数时出现了错误。这个错误可能是因为skimage库的版本问题导致的。在较新的版本中,compare_psnr函数可能已经被移除或更改了名称。 解决这个问题的方法是检查你所使用的skimage库的版本,并查看官方文档或者其他资源,确认是否有关于compare_psnr函数的更改或替代函数的信息。如果有,你可以根据文档中的指导进行相应的修改。 另外,引用\[3\]中提到的博客文章也提到了相同的错误信息。你可以参考该博客中的解决方案,看看是否适用于你的情况。 总结来说,这个错误是由于导入skimage.measure模块的compare_psnr函数时出现了问题,可能是因为库的版本不兼容或函数名称更改导致的。你可以通过查看官方文档或其他资源来解决这个问题。 #### 引用[.reference_title] - *1* *3* [Skimage包的安装及使用时报错ImportError: cannot import name ‘compare_psnr’ from ‘skimage.measure’](https://blog.csdn.net/m0_47516549/article/details/126199563)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [python debug:cannot import name ‘compare_psnr‘& cannot import name ‘compare_ssim](https://blog.csdn.net/qq_41554005/article/details/114379788)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值