为了使用方便,可以将原代码文件和两个图片文件夹均存放在一个目录之中。
1.使用Python将图像转换为灰度图像对比PSNR和SSIM
注意事项:(1)使用前先在环境中安装需要的包;
(2)本段代码先将RGB图像转换为灰度图像,忽略了色彩等信息,
请根据个人需求选取合适的方法。
import cv2
import os
import numpy as np
from skimage.metrics import structural_similarity as ssim
from skimage.metrics import peak_signal_noise_ratio as psnr
# 读取两个文件夹中的图片
folder1 = "ground_truth" #这里替换成你的文件夹路径
folder2 = "fake" #这里替换成你的文件夹路径
files1 = os.listdir(folder1)
files2 = os.listdir(folder2)
psnr_values = []
ssim_values = []
for idx, (file1, file2) in enumerate(zip(files1, files2), start=1):
img1 = cv2.imread(os.path.join(folder1, file1))
img2 = cv2.imread(os.path.join(folder2, file2))
# 转换为灰度图像
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
# 计算 PSNR
psnr_val = psnr(gray1, gray2)
psnr_values.append(psnr_val)
# 计算 SSIM
ssim_val, _ = ssim(gray1, gray2, full=True)
ssim_values.append(ssim_val)
print(f"Processing pair {idx}: {file1} and {file2}")
# 计算平均值
avg_psnr = np.mean(psnr_values)
avg_ssim = np.mean(ssim_values)
print(f"Average PSNR: {avg_psnr}, Average SSIM: {avg_ssim}")
2.使用Python直接对比彩色RGB图像的PSNR和SSIM
注意事项:(1)使用前先在环境中安装需要的包;
(2)本段代码适用于对比彩色图像的PSNR和SSIM,与灰度图像的计算结果
会有些许出入,但是差异不算大;
(3)本段python代码计算彩色RGB图像的PSNR和SSIM结果与基于Matlab的
结果基本一致,差异可以小到忽略不计;
(4)和基于Matlab的方法相比,使用Python代码计算速度会更快。
import cv2
import os
import numpy as np
from skimage.metrics import structural_similarity as ssim
from skimage.metrics import peak_signal_noise_ratio as psnr
# 读取两个文件夹中的图片
folder1 = "ground_truth2"
folder2 = "fake2"
files1 = os.listdir(folder1)
files2 = os.listdir(folder2)
psnr_values = []
ssim_values = []
for idx, (file1, file2) in enumerate(zip(files1, files2), start=1):
img1 = cv2.imread(os.path.join(folder1, file1))
img2 = cv2.imread(os.path.join(folder2, file2))
win_size = 3 #win_size可以是3,5,7。如果你使用win_size=7出现报错,可以替换为5或3,直到没
#有报错为止
# 计算 PSNR
psnr_val = psnr(img1, img2)
psnr_values.append(psnr_val)
# 计算 SSIM
ssim_val, _ = ssim(img1, img2, multichannel=True, full=True, win_size=win_size)
ssim_values.append(ssim_val)
print(f"Processing pair {idx}: {file1} and {file2}")
# 计算平均值
avg_psnr = np.mean(psnr_values)
avg_ssim = np.mean(ssim_values)
print(f"Average PSNR: {avg_psnr}, Average SSIM: {avg_ssim}")
3.使用Matlab直接对比彩色RGB图像的PSNR和SSIM
注意事项:(1)本方法的计算过程略耗时;
(2)计算结果与使用Pyhton的方法的结果几乎一致。
% 原图文件夹路径
originalFolder = 'ground_truth';
% 处理后图片文件夹路径
processedFolder = 'fake';
% 获取原图文件夹中的所有图片文件名
originalFiles = dir(fullfile(originalFolder, '*.png')); % 假设图片格式为PNG,可以根据自己的
%需要替换为jpg等格式
% 初始化PSNR和SSIM的总和
%psnrSum = 0;
ssimSum = 0;
% 遍历原图文件夹中的每个图片
for i = 1:length(originalFiles)
% 构建原图和处理后图片的完整文件路径
originalFilePath = fullfile(originalFolder, originalFiles(i).name);
processedFilePath = fullfile(processedFolder, originalFiles(i).name);
% 读取原图和处理后图片
originalImage = imread(originalFilePath);
processedImage = imread(processedFilePath);
% 计算PSNR
psnrValue = psnr(processedImage, originalImage);
% 计算SSIM
%[~, ssimValue] = ssim(processedImage, originalImage);
ssimValue = ssim(processedImage, originalImage);
% 累加PSNR和SSIM的值
psnrSum = psnrSum + psnrValue;
ssimSum = ssimSum + ssimValue;
fprintf('Processed image pair: %d/%d\n', i, length(originalFiles));
end
% 计算平均PSNR和SSIM
averagePSNR = psnrSum / length(originalFiles);
averageSSIM = ssimSum / length(originalFiles);
% 显示平均PSNR和SSIM值
fprintf('Average PSNR: %.2f dB\n', averagePSNR);
fprintf('Average SSIM: %.4f\n', averageSSIM);