文章目录

  • 前言
  • PSNR
    • Python
    • MatLab
  • SSIM
    • Python
    • MatLab

前言

使用 MatLab 计算得到的指标比 Python 的高,具体原因没有研究,欢迎交流。

PSNR

Python

def calculate_psnr(img1, img2, border=0):'''img1, img2: [0, 255]'''if not img1.shape == img2.shape:raise ValueError('Input images must have the same dimensions.')h, w = img1.shape[:2]img1 = img1[border:h-border, border:w-border]img2 = img2[border:h-border, border:w-border]img1 = img1.astype(np.float64)img2 = img2.astype(np.float64)mse = np.mean((img1 - img2)**2)if mse == 0:return float('inf')return 20 * math.log10(255.0 / math.sqrt(mse))

MatLab

function [ PSNR ] = psnr( f1,f2 )
%PSNR Summary of this function goes here
%   Detailed explanation goes here% % MSE = E( (img-Eimg)^2 )
% %     = SUM((img-Eimg)^2)/(M*N);
% function ERMS = erms(f1, f2)
% %
% e = double(f1) - double(f2);
% [m, n] = size(e);
% ERMS = sqrt(sum(e.^2)/(m*n));
% % PSNR=10log10(M*N/MSE);
% function PSNR = psnr(f1, f2)
k=1;
if max(f1(:))>2
k = 8;
end
fmax = 2.^k - 1;
a = fmax.^2;
e = double(f1) - double(f2);
[m, n] = size(e);
MSE=sum(sum(e.^2))/(m*n);
PSNR = 10*log10(a/MSE);
end

SSIM

Python

def calculate_ssim(img1, img2, border=0):'''img1, img2: [0, 255]'''#img1 = img1.squeeze()#img2 = img2.squeeze()if not img1.shape == img2.shape:raise ValueError('Input images must have the same dimensions.')h, w = img1.shape[:2]img1 = img1[border:h-border, border:w-border]img2 = img2[border:h-border, border:w-border]if img1.ndim == 2:return ssim(img1, img2)elif img1.ndim == 3:if img1.shape[2] == 3:ssims = []for i in range(3):ssims.append(ssim(img1[:,:,i], img2[:,:,i]))return np.array(ssims).mean()elif img1.shape[2] == 1:return ssim(np.squeeze(img1), np.squeeze(img2))else:raise ValueError('Wrong input image dimensions.')def ssim(img1, img2):C1 = (0.01 * 255)**2C2 = (0.03 * 255)**2img1 = img1.astype(np.float64)img2 = img2.astype(np.float64)kernel = cv2.getGaussianKernel(11, 1.5)window = np.outer(kernel, kernel.transpose())mu1 = cv2.filter2D(img1, -1, window)[5:-5, 5:-5]  # validmu2 = cv2.filter2D(img2, -1, window)[5:-5, 5:-5]mu1_sq = mu1**2mu2_sq = mu2**2mu1_mu2 = mu1 * mu2sigma1_sq = cv2.filter2D(img1**2, -1, window)[5:-5, 5:-5] - mu1_sqsigma2_sq = cv2.filter2D(img2**2, -1, window)[5:-5, 5:-5] - mu2_sqsigma12 = cv2.filter2D(img1 * img2, -1, window)[5:-5, 5:-5] - mu1_mu2ssim_map = ((2 * mu1_mu2 + C1) * (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) *(sigma1_sq + sigma2_sq + C2))return ssim_map.mean()

MatLab

function [mssim, ssim_map] = ssim(img1, img2, K, window, L)
if (nargin < 2 || nargin > 5)mssim = -Inf;ssim_map = -Inf;return;
endif (size(img1) ~= size(img2))mssim = -Inf;ssim_map = -Inf;return;
end[M N] = size(img1);if (nargin == 2)if ((M < 11) || (N < 11))mssim = -Inf;ssim_map = -Inf;returnendwindow = fspecial('gaussian', 11, 1.5);K(1) = 0.01;K(2) = 0.03;L = 255;
endif (nargin == 3)if ((M < 11) || (N < 11))mssim = -Inf;ssim_map = -Inf;returnendwindow = fspecial('gaussian', 11, 1.5);L = 255;if (length(K) == 2)if (K(1) < 0 || K(2) < 0)mssim = -Inf;ssim_map = -Inf;return;endelsemssim = -Inf;ssim_map = -Inf;return;end
endif (nargin == 4)[H W] = size(window);if ((H*W) < 4 || (H > M) || (W > N))mssim = -Inf;ssim_map = -Inf;returnendL = 255;if (length(K) == 2)if (K(1) < 0 || K(2) < 0)mssim = -Inf;ssim_map = -Inf;return;endelsemssim = -Inf;ssim_map = -Inf;return;end
endif (nargin == 5)[H W] = size(window);if ((H*W) < 4 || (H > M) || (W > N))mssim = -Inf;ssim_map = -Inf;returnendif (length(K) == 2)if (K(1) < 0 || K(2) < 0)mssim = -Inf;ssim_map = -Inf;return;endelsemssim = -Inf;ssim_map = -Inf;return;end
endimg1 = double(img1);
img2 = double(img2);f = max(1,round(min(M,N)/256));if(f>1)lpf = ones(f,f);lpf = lpf/sum(lpf(:));img1 = imfilter(img1,lpf,'symmetric','same');img2 = imfilter(img2,lpf,'symmetric','same');img1 = img1(1:f:end,1:f:end);img2 = img2(1:f:end,1:f:end);
endC1 = (K(1)*L)^2;
C2 = (K(2)*L)^2;
window = window/sum(sum(window));mu1   = filter2(window, img1, 'valid');
mu2   = filter2(window, img2, 'valid');
mu1_sq = mu1.*mu1;
mu2_sq = mu2.*mu2;
mu1_mu2 = mu1.*mu2;
sigma1_sq = filter2(window, img1.*img1, 'valid') - mu1_sq;
sigma2_sq = filter2(window, img2.*img2, 'valid') - mu2_sq;
sigma12 = filter2(window, img1.*img2, 'valid') - mu1_mu2;if (C1 > 0 && C2 > 0)ssim_map = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))./((mu1_sq + mu2_sq + C1).*(sigma1_sq + sigma2_sq + C2));
elsenumerator1 = 2*mu1_mu2 + C1;numerator2 = 2*sigma12 + C2;denominator1 = mu1_sq + mu2_sq + C1;denominator2 = sigma1_sq + sigma2_sq + C2;ssim_map = ones(size(mu1));index = (denominator1.*denominator2 > 0);ssim_map(index) = (numerator1(index).*numerator2(index))./(denominator1(index).*denominator2(index));index = (denominator1 ~= 0) & (denominator2 == 0);ssim_map(index) = numerator1(index)./denominator1(index);
endmssim = mean2(ssim_map);return

(Python+MatLab) 分别实现 PSNR 和 SSIM相关推荐

  1. matlab中中图像PSNR和SSIM的计算

    图像处理结果的度量 -- SNR.PSNR.SSIM 网上找了很多关于PSNR和SSIM的计算,很多结果算出来都不一样,公式都是普遍的,如下: 现在总结下造成结果差异的原因. PSNR的差异: 1.灰 ...

  2. Python 实现图片质量比较之PSNR和SSIM

    图片质量评价 Python 实现图片质量比较之PSNR和SSIM PSNR skimge 实现 完示例代码 TensorFlow 实现 SSIM 代码实现 Python 实现图片质量比较之PSNR和S ...

  3. matlab中psnr多了50,matlab中中图像PSNR和SSIM的计算

    网上找了很多关于PSNR和SSIM的计算,很多结果算出来都不一样,公式都是普遍的,如下: 现在总结下造成结果差异的原因. PSNR的差异:1.灰度图像:灰度图像比较好计算只有一个值. 2.彩色图像:a ...

  4. 全参考视频质量评价方法(PSNR,SSIM)以及相关数据库

    最常用的全参考视频质量评价方法有以下2种: PSNR(峰值信噪比):用得最多,但是其值不能很好地反映人眼主观感受.一般取值范围:20-40.值越大,视频质量越好. SSIM(结构相似性):计算稍复杂, ...

  5. 计算两个文件夹中图片的PSNR和SSIM

    注释:两个文件夹中图片的文件名要一致,格式.后缀都要一直,如果其他格式可以将.jpg改成.bmp 写来只是自己看,自己能用,所以跑不通您也别怪我菜 ```bash```bash```python im ...

  6. 图像质量的客观评估指标PSNR与SSIM

    PSNR SSIM 代码 参考文献 1:PSNR PSNR是最为常用的图像质量评估指标: 其中K为图像对应二进制位数,一般为8.MSE为均方误差,计算公式为: 2:SSIM SSIM[1]主要用来衡量 ...

  7. psnr 与 ssim评测步骤

    hi3559a平台: 原理: 编码器设置用户图片,作为无视频信号时的插入图片. 解码器通过VO获取视频层上的输出图像帧. 编码用到的关键MPI:HI_MPI_VI_SetUserPic 解码用到的关键 ...

  8. matlab模块 python,Matlab 和Python结合使用

    今天介绍的内容比较基础,希望能达到抛砖引玉的效果. Matlab 和 Python 结合使用无非分为两种情形: Matlab中使用Python包: Python中使用Matlab. 1. Matlab ...

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

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

  10. LQR轨迹跟踪算法Python/Matlab算法实现_代码(2)

    本文根据LQR轨迹跟踪算法Python/Matlab算法实现_LQRmatrix推导(2)使用代码实现,进行仿真: clc clear allKp = 1.0 ; dt =0.1 ;% [s] L = ...

最新文章

  1. 自动 Android* 应用测试
  2. 我是越来越喜欢做产品了
  3. linux实战应用案例: 777 权限表示什么,各数字又是什么含义?
  4. PHP闭包(Closure)初探
  5. dcase_util教程(二)——各单元介绍
  6. oracle opatch那个回退,下面是我在打OPatch时使用的一般步骤,供大家参考
  7. LeetCode 833. 字符串中的查找与替换(排序,replace)
  8. Git的基本概念/常用命令及实例
  9. express不是内部或外部命令的解决方法
  10. Oracle踩坑之解决数值0.2只显示成.2方法
  11. Excel如何将一列数据转为一行?
  12. Flink简介以及与sparkStreaming和Storm比较
  13. ArcGIS Engine开发教程之图层符号化
  14. adb native raact 夜神_如何用第三方Android模拟器调试react-native?
  15. 笔记本电脑键盘失效修复方法,我搞了好久
  16. c语言调色板5个参数,R语言中的颜色以及色板
  17. Corda技术理解之为什么有Corda?
  18. linux文件realease,怎么查看linux系统下,各文件系统版本?
  19. JavaScript——将json数组填充进excel表并下载保存
  20. UVM--组件家族、uvm_monitor uvm_agent

热门文章

  1. 新浪微博广告投放展现形式、展现位置!微博推广广告有效果吗?
  2. e5cc温控仪通讯参数设定_咨询蔚伦触摸屏与欧姆龙温度控制仪E5EZMODBUSRTU的通讯方式...
  3. 模块“*.dll“已加载,但对DllRegisterServer的调用失败,错误代码0x8002801c
  4. bitblt与StretchDIBits
  5. win7 VS2010 Visual Assist X破解
  6. 组合数学(2)——组合矩阵
  7. RIP总结(转自鸿鹄论坛)
  8. 常用值得收藏的网站/软件 持续更新中
  9. 海康威视 私有网盘 windows 客户端下载地址
  10. 各种格式视频,图片,音频免费下载