【深度学习】图像去雾,去噪里常用的相似评价指标:PSNR(峰值信噪比) SSIM(结构相似度)MSE(均方误差)
【深度学习】图像去雾,去噪里常用的相似评价指标:PSNR(峰值信噪比) SSIM(结构相似度)MSE(均方误差)
·
一、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)
更多推荐
已为社区贡献1条内容
所有评论(0)