Этот пример показывает, как сравнить эффективность различных слепых или без ссылок метрик качества изображений.
Оценка качества изображения является важной частью рабочих процессов получения, сжатия и улучшения других изображений. Желательно иметь быструю автоматизированную метрику, которая тесно имитирует субъективные показатели качества изображения. В этом примере сравнивается эффективность трех метрик качества без ссылок.
BRISQUE - Слепой/Бесфазный оценщик пространственного качества изображений
NIQE - Оценка качества изображений Naturalness
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
В приложениях, таких как потоковое видео, существует необходимость оценивать метрики качества в приемнике, который может не иметь доступа к исходной первозданной выборке. Кроме того, содержимое каждой системы координат может значительно варьироваться. Давайте моделируем такой сценарий, чтобы оценить характеристики эффективности этих метрик.
Создайте объект VideoReader, который считывает системы координат из видео '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