Значения PSNR различаются в реализации Matlab и Python.

Я реализовал код 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?


person Sumedh Pendurkar    schedule 06.07.2017    source источник
comment
Запустите обе функции с различными небольшими тестовыми данными, чтобы увидеть, есть ли разница. Если да, то отлаживать. Например. psnr([1], [2]) или psnr([1, 2], [4, 3]) или что-то в этом роде.   -  person kazemakase    schedule 06.07.2017


Ответы (1)


person    schedule
comment
Пробовал.. Дело в том, что RMSE сам по себе является float64. Таким образом, он будет вычислять поплавок. - person Sumedh Pendurkar; 06.07.2017
comment
Я подтвердил, что opencv принимает значения BGR (из их примеров кодов). Также изменил это; но результаты такие же. Я хочу сравнить свои значения psnr (из вывода кода Python и стандартного изображения) с другим набором результатов, доступных из статьи, которые реализованы в matlab/octave. Есть ли способ решить эту проблему, записывая файлы изображений, а затем используя октаву для вычисления psnr? Спасибо, что обратили на это внимание. - person Sumedh Pendurkar; 06.07.2017
comment
Ну, как я уже сказал, бит вычисления psnr и в питоне, и в октаве работает нормально, проблема, похоже, перед этим на этапе конвертации изображения. Но да, если вы хотите попробовать выгрузить материал в октаву из python, вы можете попробовать использовать oct2py модуль питона. Я обновил ответ, добавив дополнительную информацию о причине, по которой преобразование отличается. - person Tasos Papastylianou; 06.07.2017