【深度学习】图像去雾,去噪里常用的相似评价指标:PSNR(峰值信噪比) SSIM(结构相似度)MSE(均方误差)

文章目录

  • 一、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 PSNR
import matplotlib.pyplot as plt
imor=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 SSIM
import matplotlib.pyplot as plt
imor=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 MSE
import matplotlib.pyplot as plt
imor=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 torch
import numpy as np
from torchvision.datasets import STL10
import matplotlib.pyplot as plt
from skimage.util import random_noise #添加噪声模块
import torch.utils.data as Data
from sklearn.model_selection import  train_test_split
import hiddenlayer as hl
import torch.nn as nn
from tqdm import tqdm
from skimage.measure import compare_psnr
import os
os.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.0
data_path='E:/图像处理课题/自编码器去噪网络/data/stl10_binary/train_X.bin'
images=read_image(data_path)  #最后输出的5000张图片
print(type(images)) #格式为<class 'numpy.ndarray'>
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)

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2023年6月6日
下一篇 2023年6月6日

相关推荐