计算PSNR 踩过的坑

计算PSNR 踩过的坑

Python 和 Matlab

【1】读取文件格式

python的opencv中cv.imread读取文件时是unit8格式,范围在0-255之间。

matlab 的imread也一样。

所以应该每次读完文件之后需要转换成float或者double类型。

否则后面如果做加减乘除等等运算都会出错,之前是因为计算PSNR做了两张图片相减导致出现负数,在np.array中直接就变成了255

# python
import cv2
import numpy as np
img = cv2.imread("Dataset/Set5_HR/baby_GT.jpg").astype(np.float32) # convert to float32
% matlab
img = imread("Dataset/Set5_HR/baby_GT.jpg")
img = im2double(img) # scale into [0,1], equal to /255.0

【2】将RGB转换成YCbCr

opencv读取图片存进来的格式是BGR,转换成YCbCr用的是

img = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)

计算公式为

  计算PSNR 踩过的坑_第1张图片

matlab读取图片存进来的格式是RGB,转换成YCbCr用的是

img = rgb2ycbcr(img)
% The formula ycbcr = origT * rgb + origOffset, converts a RGB image in the
% range [0 1] to a YCbCr image where Y is in the range [16 235], and Cb and
% Cr are in that range [16 240].
origT = [ ...
  65.481 128.553 24.966;...
  -37.797 -74.203 112; ...
  112 -93.786 -18.214];
origOffset = [16; 128; 128];

计算公式为

计算PSNR 踩过的坑_第2张图片

 

这两种计算方式的不同也导致了最终PSNR值的不同,看很多超分的论文中bicubic的PSNR结果应该是对应matlab中的计算方式,我现在把python中的rgb转换成YCbCr换成了matlab中的公式了,结果会比论文中的PSNR高一点点,大概0.2左右,主要是opencv的bicubic和matlab中的也不同,就不细纠结了。以后发论文时或者非要衡量评价指标的时候就用matlab计算,如果只是看一下大致PSNR多少就用python的吧

转载于:https://www.cnblogs.com/amarr/p/10654113.html

你可能感兴趣的:(计算PSNR 踩过的坑)