图像相似性评价指标SSIM/PSNR

1.结构相似性指标SSIM

参考自维基百科SSIM

1.1介绍

结构相似性指标(英文:structural similarity index,SSIM index),是一种用以衡量两张数字图象相似性的指标。结构相似性在于衡量数字图像相邻像素的关联性,图像中相邻像素的关联性反映了实际场景中物体的结构信息。因此,在设计图像失真的衡量指标时,必须考虑结构性失真。SSIM指标于2004年提出1。但当图像出现位移、缩放、旋转(皆属于非结构性的失真)的情况无法有效的反映。

1.2计算

给定两个图像x,y,两者的结构相似性SSIM定义为:

SSIM(x,y)=[l(x,y)]α[c(x,y)]β[l(x,y)]γSSIM(x,y)={[l(x,y)]}^{\alpha}{[c(x,y)]}^{\beta}{[l(x,y)]}^{\gamma}SSIM(x,y)=[l(x,y)]α[c(x,y)]β[l(x,y)]γ

l(x,y)=2μxμy+C1μx2+μy2+C1l(x,y)=\frac{2\mu_x\mu_y+C_1}{\mu_x^2+\mu_y^2+C_1}l(x,y)=μx2​+μy2​+C1​2μx​μy​+C1​​

c(x,y)=2σxσy+C2σx2+σy2+C2c(x,y)=\frac{2\sigma_x\sigma_y+C_2}{\sigma_x^2+\sigma_y^2+C_2}c(x,y)=σx2​+σy2​+C2​2σx​σy​+C2​​

s(x,y)=σxy+C3σxσy+C3s(x,y)=\frac{\sigma_{xy}+C_3}{\sigma_x\sigma_y+C_3}s(x,y)=σx​σy​+C3​σxy​+C3​​

上式中:

———— l(x,y):比较两个图像的亮度,像素均值

———— c(x,y):比较两个图像的对比度,像素方差

———— s(x,y):比较两个图像的结构,协方差,像素间关系。

————α,β,γ\alpha,\beta,\gammaα,β,γ:大于零,调整l(x,y),c(x,y),s(x,y)相对重要性的参数。

————μx,μy,σx,σy\mu_x,\mu_y,\sigma_x,\sigma_yμx​,μy​,σx​,σy​分别是x,y的均值和方差。
—————σxy\sigma_{xy}σxy​:是x,y的协方差,为E[(X−E(X))(Y−E(Y))]E[(X-E(X))(Y-E(Y))]E[(X−E(X))(Y−E(Y))]

————C1,C2,C3C_1,C_2,C_3C1​,C2​,C3​:都为常数,用以保证l(x,y),c(x,y),s(x,y)的稳定

SSIM值越大代表相似度越高。

特点:

  • 1)结构相似性指标是对称的,即SSIM(x,y)=SSIM(y,x)
  • 2)结构相似性指标的范围为0到1。

实际使用中,会使用滑动窗口,在NXN的小区块中分别计算视窗内的结构相似性指标,最后将所有的局部结构相似性指标值求平均,即为两张图像的SSIM值,也被称作MSSIM(Mean SSIm)。计算时,一般会将参数设置为α=β=β=1,C3=C22\alpha=\beta=\beta=1,C_3=\frac{C_2}{2}α=β=β=1,C3​=2C2​​,SSIM计算可简化为:

SSIM(x,y)=(2μxμy+C1)(2σxy+C2)(μx2+μy2+C1)(σx2+σy2+C2)SSIM(x,y)=\frac{(2\mu_x\mu_y+C_1)(2\sigma_{xy}+C_2)}{(\mu_x^2+\mu_y^2+C_1)(\sigma_x^2+\sigma_y^2+C_2)}SSIM(x,y)=(μx2​+μy2​+C1​)(σx2​+σy2​+C2​)(2μx​μy​+C1​)(2σxy​+C2​)​

1.3.Python代码实现

import sys
import numpy
from scipy import signal
from scipy import ndimagedef fspecial_gauss(size, sigma):x, y = numpy.mgrid[-size//2 + 1:size//2 + 1, -size//2 + 1:size//2 + 1]g = numpy.exp(-((x**2 + y**2)/(2.0*sigma**2)))return g/g.sum()def ssim(img1, img2, cs_map=False):img1 = img1.astype(numpy.float64)img2 = img2.astype(numpy.float64)size = 11sigma = 1.5window = fspecial_gauss(size, sigma)K1 = 0.01K2 = 0.03L = 255 #bitdepth of imageC1 = (K1*L)**2C2 = (K2*L)**2mu1 = signal.fftconvolve(window, img1, mode='valid')mu2 = signal.fftconvolve(window, img2, mode='valid')mu1_sq = mu1*mu1mu2_sq = mu2*mu2mu1_mu2 = mu1*mu2sigma1_sq = signal.fftconvolve(window, img1*img1, mode='valid') - mu1_sqsigma2_sq = signal.fftconvolve(window, img2*img2, mode='valid') - mu2_sqsigma12 = signal.fftconvolve(window, img1*img2, mode='valid') - mu1_mu2if cs_map:return (((2*mu1_mu2 + C1)*(2*sigma12 + C2))/((mu1_sq + mu2_sq + C1)*(sigma1_sq + sigma2_sq + C2)), (2.0*sigma12 + C2)/(sigma1_sq + sigma2_sq + C2))else:return ((2*mu1_mu2 + C1)*(2*sigma12 + C2))/((mu1_sq + mu2_sq + C1)*(sigma1_sq + sigma2_sq + C2))def mssim(img1, img2):"""refer to https://github.com/mubeta06/python/tree/master/signal_processing/sp"""level = 5weight = numpy.array([0.0448, 0.2856, 0.3001, 0.2363, 0.1333])downsample_filter = numpy.ones((2, 2))/4.0im1 = img1.astype(numpy.float64)im2 = img2.astype(numpy.float64)mssim = numpy.array([])mcs = numpy.array([])for l in range(level):ssim_map, cs_map = ssim(im1, im2, cs_map=True)mssim = numpy.append(mssim, ssim_map.mean())mcs = numpy.append(mcs, cs_map.mean())filtered_im1 = ndimage.filters.convolve(im1, downsample_filter, mode='reflect')filtered_im2 = ndimage.filters.convolve(im2, downsample_filter, mode='reflect')im1 = filtered_im1[::2, ::2]im2 = filtered_im2[::2, ::2]return (numpy.prod(mcs[0:level-1]**weight[0:level-1])*(mssim[level-1]**weight[level-1]))mssim_val = mssim(img, noise_img)
ssim_val = ssim(img, noise_img)
print(f"mssim_val: {mssim_val}, ssim_val: {ssim_val.mean()}")

2.峰值信噪比PSNR

2.1介绍

峰值信噪比(Peak Signal to Noise Ratio, PSNR),表示的是信号的最大功率与噪声功率的比值。峰值信噪比越高,表示噪声影响越小;峰值信噪比越低,表示噪声影响越大。3单位是分贝dB,大于30dB,压缩前后图像质量肉眼很难看出区别。

2.2计算方式

通常噪声常使用均方误差(Mean Square Error,MSE)来描述。两个宽高为w,h的灰度图I\KI为无噪声图像,KI的带噪声近似,则:

MSE=1ωh∑i=0ω−1∑j=0h−1[I(i,j)−K(i,j)]2MSE=\frac{1}{\omega h}\sum_{i=0}^{\omega-1}\sum_{j=0}^{h-1}[I(i,j)-K(i,j)]^2MSE=ωh1​∑i=0ω−1​∑j=0h−1​[I(i,j)−K(i,j)]2

PSNR=10log10(MAXI2MSE)=20log10(MAX1MSE)PSNR=10{log}_{10}\left (\frac{MAX_I^2}{MSE} \right )=20{log}_{10}\left (\frac{MAX_1}{\sqrt{MSE}} \right )PSNR=10log10​(MSEMAXI2​​)=20log10​(MSE​MAX1​​)

MAXIMAX_IMAXI​是表示图像点颜色的最大数值,如果每个采样点用 8 位表示,则为28=2552^8=25528=255

若为彩色图像,通常有三种方法来计算:

  • 1)分别计算 RGB 三个通道的 PSNR,然后取平均值。
  • 2)MSE使RGB三通道MSE的平均
  • 3)图片转化为YCbCr格式,然后只计算Y分量也就是亮度分量的 PSNR

针对超光谱图像,我们需要针对不同波段分别计算 PSNR,然后取平均值,这个指标称为 MPSNR。

2.3Python实现

import numpy as np
def get_psnr(I, K):error = K - Imse = np.mean(np.square(error))psnr = 10 * np.log10(255 * 255 / mse)return psnrpsnr_value = get_psnr(img, noise_img)
print(f"psnr_value: {psnr_value}")

补充:

上述计算使用的是添加了高斯噪声的图像和原图。

import cv2
import numpy as np
file_path = "img.png"def get_gauss_noise_image(image):row,col= image.shapegauss = np.random.normal(0, 50, (row,col))gauss = gauss.reshape(row,col)noisy = image + gaussreturn noisyimg = cv2.imread(file_path, cv2.IMREAD_GRAYSCALE)
cv2.imwrite("gray_text.png", img)
noise_img = get_gauss_noise_image(img)
cv2.imwrite("gray_noise_text.png", noise_img)
# pnsr=12

参考:
[1]:https://www.cns.nyu.edu/pub/lcv/wang03-preprint.pdf
[2]:https://zh.wikipedia.org/wiki/%E7%B5%90%E6%A7%8B%E7%9B%B8%E4%BC%BC%E6%80%A7#cite_note-SSIM-1
[3]:https://zh.wikipedia.org/wiki/%E5%B3%B0%E5%80%BC%E4%BF%A1%E5%99%AA%E6%AF%94

图像相似性评价指标SSIM/PSNR相关推荐

  1. 图像相似性评价指标(SSIM、MSE、PSNR)简单介绍及计算方法

    图像相似性评价指标 图像相似性评价指标 SSIM(结构相似性) MSE(均方误差) PSNR(峰值信噪比 ) 使用python进行计算 图像相似性评价指标 对于图像生成质量的通用性评价指标主要有SSI ...

  2. 图像的评价指标之PSNR——峰值信噪比

    图像的评价指标之PSNR--峰值信噪比 文章目录: 以及Python的实现 参考: https://blog.csdn.net/szfhy/article/details/49615833 https ...

  3. 两种常用的全参考图像质量评价指标——峰值信噪比(PSNR)和结构相似性(SSIM)

    原文:https://blog.csdn.net/zjyruobing/article/details/49908979 1.PSNR(Peak Signal to Noise Ratio)峰值信噪比 ...

  4. 【图像评价指标】PSNR和SSIM

    PSNR是一种全参考的图像质量评价指标.给定一个大小为m x n的清晰图像I和噪声图像K,均方误差MSE为: 则PSNR(dB)定义为: 其中,MSE表示当前图像X和参考图像Y的均方误差(Mean S ...

  5. 【图像处理】——图像质量评价指标信噪比(PSNR)和结构相似性(SSIM)(含原理和Python代码)

    目录 一.信噪比(PSNR) 1.信噪比的原理与计算公式 2.Python常规代码实现PSNR计算 3.TensorFlow实现PSNR计算 4.skimage实现PSNR计算 5.三种方法计算的结果 ...

  6. 图像质量评价指标: PSNR 和 SSIM

    PSNR: Image quality assessment: from error visibility to structural similarity SSIM: Image Quality A ...

  7. 图像质量评价指标之 PSNR 和 SSIM

    1.PSNR (Peak Signal-to-Noise Ratio) 峰值信噪比 概念: PSNR(PeakSignaltoNoiseRatio) 峰值信噪比,是信号最大功率与信号噪声功率之比. 通 ...

  8. 图像质量评价指标: PSNR 和 SSIM 和 LPIPS

    简单介绍: 1.PSNR:峰值信噪比 图像与影像压缩中典型的峰值讯噪比值在30dB 到50dB 之间,愈高愈好. PSNR接近50dB ,代表压缩后的图像仅有些许非常小的误差. PSNR大于30dB ...

  9. 图像的评价指标之SSMI——结构相似性

    图像的评价指标之SSMI--结构相似性 文章目录: https://blog.csdn.net/chaipp0607/article/details/70158835 https://zhuanlan ...

最新文章

  1. css 倒三角_倒三角结构:如何管理大型CSS项目
  2. javascript十六进制数字和ASCII字符之间转换
  3. java插入时间 mssql_JAVA操作数据库Datetime数据
  4. ElasticSearch第一天
  5. java 井字棋 人机_井字游戏 人机对战 java实现
  6. 过拟合和欠拟合_现代深度学习解决方案中的两大挑战:拟合和欠拟合
  7. python删除特定的几行数据_Python:分成几行,并根据搜索删除特定行 - python
  8. MyCat双机HA高可用集群搭建_Keepalived安装和配置---MyCat分布式数据库集群架构工作笔记0029
  9. VB程序设计练习题(2022年新)
  10. 计算机考研复试之计算机网络
  11. cshop是什么开发语言_C-SHOP编程是什么
  12. 外贸报价后如何跟进客户?winseeing可快速报价展示样品
  13. python-基础杂集
  14. 解忧杂货铺----读后感
  15. 通信感知一体化技术思考
  16. Java线程池原理与实例详解
  17. 硬盘和显卡的访问与控制
  18. 如何调整Thinkpad x230的mini DP输出分辨率?
  19. Mac下.CR2格式图片批量转换
  20. 那些年我们遇到的坑(3)-basePackages和scanBasePackages

热门文章

  1. iText导出PDF经典实现
  2. 性能值得期待,AMD Ryzen 5/Ryzen 3处理器模拟测试
  3. input、textarea设置光标位置 | ele.setSelectionRange()
  4. PHP 抽象类的简单测试与总结
  5. LINUX SHELL脚本攻略笔记[速查]
  6. 牛客白月赛19【题解】
  7. KALI更新软件源地址
  8. 12月 日语等级考试报名时间
  9. matlab的continue,MATLAB continue语句
  10. 360 序列帧html生成工具,三款专业H5工具评测:意派Epub360、ih5、mugeda