图像质量评估:用Python几行代码计算SSIM与PSNR的秘诀
下滑查看解决方法
🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇
🎓 博主简介:985高校的普通本硕,曾有幸发表过人工智能领域的 中科院顶刊一作论文,熟练掌握PyTorch框架。
🔧 技术专长: 在CV、NLP及多模态等领域有丰富的项目实战经验。已累计一对一为数百位用户提供近千次专业服务,助力他们少走弯路、提高效率,近一年好评率100% 。
📝 博客风采: 积极分享关于深度学习、PyTorch、Python相关的实用内容。已发表原创文章500余篇,代码分享次数逾四万次。
💡 服务项目:包括但不限于科研入门辅导、知识付费答疑以及个性化需求解决。
欢迎添加👉👉👉底部微信(gsxg605888)👈👈👈与我交流
(请您备注来意)
(请您备注来意)
(请您备注来意)
下滑查看解决方法
🌳引言🌳
在图像处理和计算机视觉领域,图像质量评估是一个重要的研究课题。其中,结构相似性指标(SSIM)和峰值信噪比(PSNR)是两种常用的图像质量评估方法。本文将介绍如何使用几行代码计算图像的SSIM和PSNR,帮助您更好地理解和应用这两种评估方法。
🌳SSIM和PSNR在不同方面的区别🌳
指标 | SSIM(结构相似度指标) | PSNR(峰值信噪比) |
---|---|---|
定义 | 衡量两幅图像的相似度,基于亮度、对比度和结构信息 | 衡量信号的最大可能功率与影响信号表示精度的破坏性噪声功率的比值 |
原理 | 通过比较两个图像的局部窗口来提取结构信息,基于人类视觉系统的感知特性 | 通过计算均方误差(MSE)来衡量信号与噪声之间的差异 |
范围 | 值介于-1到1之间,1表示完全相同 | 值越高表示信号质量越好,通常以分贝(dB)为单位 |
优点 | 能够综合考虑图像的亮度、对比度和结构信息,更符合人类视觉系统的感知特性 | 计算简单,广泛应用于图像压缩和通信领域 |
缺点 | 计算复杂度相对较高,对局部窗口的大小和选择敏感 | 只考虑信号的幅度信息,忽略了相位和结构信息,与人类视觉系统的感知特性差异较大 |
应用场景 | 图像质量评估、图像处理和计算机视觉任务,如图像压缩、图像增强、图像恢复等 | 图像压缩、通信等领域中的信号重建质量评估 |
🌳计算两幅图像的SSIM和PSNR(详细注释)🌳
- SSIM是一种衡量两幅图像结构相似性的指标,值越接近1表示两幅图像越相似。
- PSNR是一种衡量图像重建质量的指标,值越大表示重建质量越好。
以图像去雾任务作为例子,给定待去雾图像和清晰图像的图片路径,运行以下代码即可实现这个图像对的SSIM和PSNR的计算:
完整代码:
import cv2
import numpy as np
from PIL import Image
from skimage.metrics import structural_similarity
from skimage.metrics import peak_signal_noise_ratio
def clear_image(clear_img_path, hazy_img_path):
"""
该函数用于读取图像并计算去雾前后图像的PSNR与SSIM值。
:param clear_img_path: 清晰图像路径
:param hazy_img_path: 待去雾图像路径
:return: None
"""
# 读取清晰图像和待去雾图像
clear_img = cv2.imread(clear_img_path)
hazy_img = cv2.imread(hazy_img_path)
# 检查图像尺寸是否一致,若不一致则进行缩放
if clear_img.shape[0] != hazy_img.shape[0] or clear_img.shape[1] != hazy_img.shape[1]:
pil_img = Image.fromarray(hazy_img)
pil_img = pil_img.resize((clear_img.shape[1], clear_img.shape[0]))
hazy_img = np.array(pil_img)
# 计算PSNR和SSIM值,PSNR越大表示图像质量越好,SSIM越大表示两图像越相似
PSNR = peak_signal_noise_ratio(clear_img, hazy_img)
print('PSNR: ', PSNR)
SSIM = structural_similarity(clear_img, hazy_img, channel_axis=2)
print('SSIM: ', SSIM)
# 测试函数
clear_img_path = "/path/to/clear/1398.png"
hazy_img_path = "/path/to/hazy/1398_5.png"
clear_image(clear_img_path, hazy_img_path)
代码输入:
- 清晰图片:
- 含雾图片:
运行结果:
🌳计算多个图像对的SSIM和PSNR(详细注释)🌳
- 某文件夹含有多个待去雾图像,另一个文件夹含有多个对应的清晰图像;
- 待去雾图片文件名是jpg格式图片,清晰图片文件名是png格式图片;
- 例子:如果清晰图片文件名为img_001.png, 则对应的待去雾图片文件名为img_001.jpg。
- 运行以下代码即可计算这些图像对的SSIM和PSNR的平均值:
import os
import cv2
import numpy as np
from PIL import Image
from skimage.metrics import structural_similarity
from skimage.metrics import peak_signal_noise_ratio
import warnings
warnings.filterwarnings('ignore')
def calculate_psnr_ssim(clear_img_path, hazy_img_path, clear_img_names, hazy_img_names):
"""
该函数用于计算去雾前后图像的PSNR与SSIM值。
:param clear_img_path: 清晰图像文件夹路径
:param hazy_img_path: 待去雾图像文件夹路径
:param clear_img_names: 清晰图像文件名列表
:param hazy_img_names: 待去雾图像文件名列表
:return: None
"""
SSIM_list = []
PSNR_list = []
for i in range(len(clear_img_names)):
clear_img = cv2.imread(os.path.join(clear_img_path, clear_img_names[i]))
hazy_img = cv2.imread(os.path.join(hazy_img_path, hazy_img_names[i]))
if clear_img.shape[0] != hazy_img.shape[0] or clear_img.shape[1] != hazy_img.shape[1]:
pil_img = Image.fromarray(hazy_img)
pil_img = pil_img.resize((clear_img.shape[1], clear_img.shape[0])) # 和clear_img的宽和高保持一致
hazy_img = np.array(pil_img)
# 计算PSNR
PSNR = peak_signal_noise_ratio(clear_img, hazy_img)
print(i + 1, 'PSNR: ', PSNR)
PSNR_list.append(PSNR)
# 计算SSIM
SSIM = structural_similarity(clear_img, hazy_img, channel_axis=2)
print(i + 1, 'SSIM: ', SSIM)
SSIM_list.append(SSIM)
print("average SSIM", sum(SSIM_list) / len(SSIM_list))
print("average PSNR", sum(PSNR_list) / len(PSNR_list))
# 测试函数
calculate_psnr_ssim(clear_img_path, hazy_img_path, clear_img_names, hazy_img_names)
🌳结尾🌳
亲爱的读者,首先感谢您抽出宝贵的时间来阅读我们的博客。我们真诚地欢迎您留下评论和意见💬。
俗话说,当局者迷,旁观者清。您的客观视角对于我们发现博文的不足、提升内容质量起着不可替代的作用。
如果博文给您带来了些许帮助,那么,希望您能为我们点个免费的赞👍👍/收藏👇👇,您的支持和鼓励👏👏是我们持续创作✍️✍️的动力。
我们会持续努力创作✍️✍️,并不断优化博文质量👨💻👨💻,只为给您带来更佳的阅读体验。
如果您有任何疑问或建议,请随时在评论区留言,我们将竭诚为你解答~
愿我们共同成长🌱🌳,共享智慧的果实🍎🍏!
万分感谢🙏🙏您的点赞👍👍、收藏⭐🌟、评论💬🗯️、关注❤️💚~