Я реализовал код Python для вычисления значений PSNR канала Y в канале YCrCb. Я получаю значения PSNR около 35,7 дБ (для пары изображений).
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]))
В основном 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,06 дБ (для той же пары изображений).
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])
или что-то в этом роде. - person kazemakase   schedule 06.07.2017