计算PSNR 踩过的坑
Python 和 Matlab
【1】读取文件格式
python的opencv中cv.imread读取文件时是unit8格式,范围在0-255之间。
matlab 的imread也一样。
所以应该每次读完文件之后需要转换成float或者double类型。
否则后面如果做加减乘除等等运算都会出错,之前是因为计算PSNR做了两张图片相减导致出现负数,在np.array中直接就变成了255
【2】将RGB转换成YCbCr
opencv读取图片存进来的格式是BGR,转换成YCbCr用的是
img = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
计算公式为
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值的不同,看很多超分的论文中bicubic的PSNR结果应该是对应matlab中的计算方式,我现在把python中的rgb转换成YCbCr换成了matlab中的公式了,结果会比论文中的PSNR高一点点,大概0.2左右,主要是opencv的bicubic和matlab中的也不同,就不细纠结了。以后发论文时或者非要衡量评价指标的时候就用matlab计算,如果只是看一下大致PSNR多少就用python的吧