【发布时间】:2017-12-10 04:45:28
【问题描述】:
我已经实现了一个 python 代码来计算 YCrCb 通道中 Y 通道的 PSNR 值。 我得到的 PSNR 值约为 35.7dB(对于一对图像)
import cv2, main
import sys
i1 = cv2.imread(sys.argv[1])
i2 = cv2.imread(sys.argv[2])
i1= cv2.cvtColor(i1, cv2.COLOR_BGR2YCrCb)
i2= cv2.cvtColor(i2, cv2.COLOR_BGR2YCrCb)
print(main.psnr(i1[:,:,0], i2[:,:,0]))
在main psnr中定义为:
def psnr(target, ref):
import cv2
target_data = numpy.array(target, dtype=numpy.float64)
ref_data = numpy.array(ref,dtype=numpy.float64)
diff = ref_data - target_data
print(diff.shape)
diff = diff.flatten('C')
rmse = math.sqrt(numpy.mean(diff ** 2.))
return 20 * math.log10(255 / rmse)
我在 matlab 中获得了一个在线实现(来自我所指的论文) 我得到的 PSNR 值约为 37.06dB(对于同一对图像)
function psnr=compute_psnr(im1,im2)
if size(im1, 3) == 3,
im1 = rgb2ycbcr(im1);
im1 = im1(:, :, 1);
end
if size(im2, 3) == 3,
im2 = rgb2ycbcr(im2);
im2 = im2(:, :, 1);
end
imdff = double(im1) - double(im2);
imdff = imdff(:);
rmse = sqrt(mean(imdff.^2));
psnr = 20*log10(255/rmse)
这个错误可能是由于 numpy 引入的错误还是 numpy 似乎可以达到的准确度?
【问题讨论】:
-
用各种小测试数据运行这两个函数,看看是否有差异。如果是,则调试。例如。
psnr([1], [2])或psnr([1, 2], [4, 3])或类似的东西。
标签: matlab opencv numpy octave mse