文章目录

  • 一、PSNR(峰值信噪比)
  • 二、SSIM(结构相似度)
  • 三、MSE(均方误差)
  • 小插曲:plt.savefig()保存的图片为空白

一、PSNR(峰值信噪比)


公式直接抄我师哥论文上的,n通常取8,表示0-255.值越大表明越接近真实图像。
在使用前需要从掉包:

from skimage.metrics import peak_signal_noise_ratio

我们用三张图,来试一个例子:


这三张图分别在路径下:

分别计算第一张和第二张图的PSNR,第一张图和第三张图的PSNR

from skimage.metrics import peak_signal_noise_ratio as PSNRimport matplotlib.pyplot as pltimor=plt.imread('imor.jpeg')imnose=plt.imread('imnose.jpg')imde=plt.imread('imde.jpeg')print('原图和噪点图的PSNR为{}'.format(PSNR(imor,imnose)))print('原图和去噪图的PSNR为{}'.format(PSNR(imor,imde)))

从这里可以看到去噪图的PSNR更高,说明去噪效果不错。

二、SSIM(结构相似度)

SSIM公式:

SSIM范围在0-1之间。
SSIM和PSNR还不太一样,使用起来要多调几个参数,不是那麽简单
我们首先看看函数构造:

im1和im2就不说了,后面那一堆还挺复杂的(如果后面参数不管的话,只放入前两个参数会报错。)

反正要加一个multichannel=True把

from skimage.metrics import structural_similarity as SSIMimport matplotlib.pyplot as pltimor=plt.imread('imor.jpeg')imnose=plt.imread('imnose.jpg')imde=plt.imread('imde.jpeg')print('原图和噪点图的PSNR为{}'.format(SSIM(imor,imnose,multichannel=True)))print('原图和去噪图的PSNR为{}'.format(SSIM(imor,imde,multichannel=True)))


这里去噪图的PSNR明显比噪点图高,说明去噪效果不错

三、MSE(均方误差)

from skimage.metrics import mean_squared_error as MSEimport matplotlib.pyplot as pltimor=plt.imread('imor.jpeg')imnose=plt.imread('imnose.jpg')imde=plt.imread('imde.jpeg')print('原图和噪点图的MSE为{}'.format(MSE(imor,imnose)))print('原图和去噪图的MSE为{}'.format(MSE(imor,imde)))

小插曲:plt.savefig()保存的图片为空白

今天在做这个实验时,需要一组对照图片,所以我去STL10这个数据集里面去下载和保存一些照片,准备用savefig保存一些照片:

import torchimport numpy as npfrom torchvision.datasets import STL10import matplotlib.pyplot as pltfrom skimage.util import random_noise #添加噪声模块import torch.utils.data as Datafrom sklearn.model_selection importtrain_test_splitimport hiddenlayer as hlimport torch.nn as nnfrom tqdm import tqdmfrom skimage.measure import compare_psnrimport osos.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"data=STL10('data',download=False)def read_image(path):with open(path,'rb') as f:data1=np.fromfile(f,dtype=np.uint8)images=np.reshape(data1,(-1,3,96,96))images=np.transpose(images,(0,3,2,1))return images/255.0data_path='E:/图像处理课题/自编码器去噪网络/data/stl10_binary/train_X.bin'images=read_image(data_path)#最后输出的5000张图片print(type(images)) #格式为print("images.shape:",images.shape)print("images.shape:",images.shape[0])#print(images)plt.figure(figsize=(3,3))for i in range(1):plt.subplot(1,1,1)plt.imshow(images[i+1000])plt.axis('off')plt.show()plt.savefig('1.jpg')

最开始我的代码就是这样写的,结果发现,保存的图片为空白:

这里发生这个错误的原因是,plt.show()和plt.savefig()不能放在一起用。
如果要正常运行,需要把plt.show()注释掉,之后就正常了:

不过如果要把ndarray保存为图像,一般用plt.imsave还是挺合适的:

plt.imsave('imor.jpeg', imor)