В этом примере показано, как сравнивать производительность различных скрытых или не ссылающихся метрик качества изображения.
Оценка качества изображения является важной частью процессов получения, сжатия и других улучшений изображения. Желательно иметь быструю автоматизированную метрику, которая близко имитирует субъективные показатели качества изображения. В этом примере сравнивается производительность трех безреферентных показателей качества.
BRISQUE - Блайнд/Безреферентный анализатор пространственного качества изображения
NIQE - Средство оценки качества изображения естественности
PIQE - оценщик качества изображения на основе восприятия
Каждая метрика имеет различные сильные стороны в зависимости от изображений в наборе данных. Чтобы выбрать наилучшую метрику для данных, можно сравнить производительность трех метрик с данными образца изображения. В этом примере показано, как сравнивать производительность в двух различных ситуациях: различные уровни сжатия JPEG на одном изображении и для видеопотока.
Сжатие изображения - это компромисс между качеством изображения и степенью сжатия или размером выходных данных. Компромисс также зависит от содержимого изображения. Например, изображения с однородными областями могут сжиматься до меньших размеров и иметь меньше артефактов, чем изображения с подробными характеристиками. Метрики качества изображения могут помочь в анализе этого компромисса при попытке минимизировать влияние содержимого изображения на анализ.
Чтение изображения в рабочую область.
im = imread('llama.jpg');Запись копий изображения с различными коэффициентами сжатия JPG. Считывайте все сжатые изображения обратно в рабочую область.
jpegQuality = 10:10:100; numObservations = numel(jpegQuality); compressedFrames = cell(1,numObservations); for ind = 1:numObservations q = jpegQuality(ind); tempFile = ['llama_compression_',num2str(q),'.jpg']; imwrite(im,tempFile,'Quality',q); compressedFrames{ind} = imread(tempFile); end
Проверьте сжатые изображения.
tiledlayout(1,3);
h1 = nexttile;
imshow(compressedFrames{1})
title('JPEG Quality: 10')
nexttile
imshow(compressedFrames{7})
title('JPEG Quality: 70')
nexttile
imshow(im)
title('Input Image')
linkaxes
Увеличьте изображение в сжатом виде, чтобы увидеть характер некоторых определенных артефактов. При JPEG качестве 10 блокирующие артефакты очевидны.
h1.XLim = [650 700]; h1.YLim = [490 550];

Для каждого сжатого изображения JPG вычислите показатель качества с использованием трех показателей качества.
pQ = zeros(1, numObservations); nQ = zeros(1, numObservations); bQ = zeros(1, numObservations); for ind=1:numObservations bQ(ind) = brisque(compressedFrames{ind}); nQ(ind) = niqe(compressedFrames{ind}); pQ(ind) = piqe(compressedFrames{ind}); end
Визуализация показателей по мере повышения качества JPEG. Нормализуйте оценки таким образом, чтобы каждая оценка имела одинаковое значение для несжатого изображения. Для этих трех показателей более низкие оценки соответствуют более высокому качеству изображения.
Оценка BRISQUE для качества JPEG 50, 60 и 70 нереально ниже, чем для несжатых изображений JPEG. Поэтому для изображений, подобных этому тестовому образу, NIQE и PIQE являются более надежными метриками.
figure hold on plot(jpegQuality,bQ/bQ(end),'*-'); plot(jpegQuality,nQ/nQ(end),'*-'); plot(jpegQuality,pQ/pQ(end),'*-'); legend('BRISQUE','NIQE','PIQE'); ylabel('Metric Score') xlabel('JPEG Quality') hold off

В таких приложениях, как потоковое видео, существует потребность в оценке метрик качества в приемнике, который может не иметь доступа к исходному первозданному образцу. Кроме того, содержание каждого кадра может значительно изменяться. Давайте смоделируем такой сценарий, чтобы оценить характеристики производительности этих метрик.
Создайте объект VideyReader, считывающий кадры из видео rhinos.avi. Это видео имеет 114 кадров.
vidObjR = VideoReader('rhinos.avi'); vidObjW = VideoWriter('varyingCompressed.avi'); open(vidObjW)
Создание графика с изменяющейся степенью сжатия для имитации передач с изменяющейся скоростью передачи битов в реальном времени
numFrames = vidObjR.NumFrames; varyingQuality = sin(2*pi*(1:numFrames)*0.01); varyingQuality = round(rescale(varyingQuality)*100); varyingQuality = max(varyingQuality,1); % min JPEG quality is 1 figure plot(varyingQuality); title('JPEG Quality Schedule'); ylabel('JPEG Quality') xlabel('Frame Index')

Для каждого кадра видео сжимайте кадр в соответствии с графиком качества JPEG. Вычислите метрики сжатого кадра и добавьте сжатый кадр к выходному видео для проверки.
pQ = zeros(1,numFrames); nQ = zeros(1,numFrames); bQ = zeros(1,numFrames); ind = 1; while hasFrame(vidObjR) im = readFrame(vidObjR); % Compress it based on the schedule tempFile = 'rhinos_compressed_frame.jpg'; imwrite(im,tempFile,'Quality',varyingQuality(ind)); frame = imread(tempFile); writeVideo(vidObjW,frame); bQ(ind) = brisque(frame); nQ(ind) = niqe(frame); pQ(ind) = piqe(frame); ind = ind+1; end close(vidObjW);
Визуализируйте тренд, ожидайте, что он будет имитировать график сжатия. Масштабируйте метрики, чтобы сосредоточиться на тренде, и инвертируйте график качества, чтобы получить тренд степени сжатия. Показатели качества все еще могут давать полезную индикацию воспринимаемого качества без доступа к исходной системе отсчета.
figure hold on plot(rescale(bQ)); plot(rescale(nQ)); plot(rescale(pQ)); % Invert JPEG Quality to get the compression ratio plot(1-rescale(varyingQuality),'k','LineWidth',2) legend('BRISQUE','NIQE','PIQE','Compression Ratio'); title('Trend of Quality Metrics with Varying Compression and Content'); ylabel('Metric Score') xlabel('Frame Index') hold off

brisque | brisqueModel | fitbrisque | fitniqe | niqe | niqeModel