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