Obiektywne pomiary jakości sekwencji wizyjnych
Autorzy: Michał Grega, Lucjan Janowski, Mikołaj Leszczuk, Zdzisław Papir
Pliki: rozdzial_19.zip, PSNR_search.zip (41 MiB), cvqm_src_v30.zip (54 MiB), Metryki_jakosci_oparte_o_analize_pakietow.zip (58 MiB).
Przykład 19.1
W przykładzie 19.1 (plik przyklad_19_1.m) wczytywany jest obraz lena.png, następnie uzyskiwany jest kanał Y tego obrazu. W dalszej kolejności do każdej wartości piksela obrazu lenaY dodawana jest wartość 20, przez co cały obraz jest rozjaśniany. Ponieważ w środowisku MATLAB obraz jest reprezentowany jako typ zmiennej uint8, wartości przekraczające 255 zostaną ograniczone do tej właśnie wartości. Dla powstałych w wyniku tych operacji obrazów, a więc oryginalnego lenaY oraz rozjaśnionego lena20, obliczana jest wartość PSNR, wyno-sząca w tym konkretnym przykładzie 22.1 [dB].% Przykład 19.1 lena=imread('lena.png'); % wczytanie obrazu lena.png do jako zmiennej lena lenaY=rgb2gray(lena); % przekształcenie obrazu RGB I zapisanie kanału Y jako % zmiennej lenaY lena20=lenaY+20; % rozjaśnienie obrazu lena o 20 i zapisanie jako lena20 PSNR(lenaY, lena20); % obliczenie PSNR dla obrazów lena i lena20
Przykład 19.2
W przykładzie 19.2 (plik przyklad_19_2.m) każdy piksel obrazu jest rozjaśniany o losową wartość z przedziału [0;20] i obliczana jest wartość PSNR w porównaniu z obrazem oryginalnym. W tym konkretnym przykładzie uzyskana wartość PSNR wynosi 26,9 [dB].% Przykład 19.2 lena=imread('lena.png'); % wczytanie obrazu lena.png do jako zmiennej lena lenaY=rgb2gray(lena); %RGB do YUV zapisanie kanału Y jako zmiennej lenaY randomMatrix=20.*rand(512,512); % utworzenie macierzy z wartościami losowymi randomMatrix=uint8(randomMatrix); %konwersja do typu uint8 lenaDistorted=lenaY+randomMatrix; %dodanie losowego szumu PSNR(lenaY, lenaDistorted); % obliczenie PSNR dla obrazów lena i lenaDistorted
Przykład 19.3
Materiały do przykładu 19.3 (plik przyklad_19_3.m) - funkcje matlaba , plik "readme" oraz przykładowe sekwencje Video znajdują się w dołączonym archiwum PSNR_search.zip (publikacja za zgodą autora, www.its.bldrdoc.gov).W przykładzie 19.3 pierwszy parametr ‘C:\test\’ oznacza katalog zawierający analizowane sekwencje wizyjne. Nazewnictwo sekwencji w katalogu musi być zgodne z formatem [na-zwaTestu]_[nazwaSekwencji]_[{original,hrcX}].yuv. Sekwencja oryginalna winna mieć w nazwie słowo original zaś sekwencje zniekształcone – hrcX, gdzie X oznacza kolejne nu-mery sekwencji. Dalsze parametry w przykładzie to psnr czyli nazwa sekwencji, out.cvs czyli nazwa pliku wynikowego, yuv określające format sekwencji oraz wymiary klatki w badanych sekwencjach.
% Przykład 19.3 psnr_search 'C:\test\' 'psnr' 'out.csv' 'yuv' 144 176
Przykład 19.4
Przykład 19.4 (plik przyklad_19_4.m) pokazuje jak użyć biblioteki TracesPlay do zilustrowania liczby generowanych bitów uśrednianej dla kolejnych dziesięciu pakietów. Więcej przykładów można znaleźć na stronie biblioteki http://tracesplay.sourceforge.net/.%Przykład 19.4 %Wywołae biblioteki TracesPlay i odczytanie trzech wartości dla każdego %pakietu, czas w sekundach i mikrosekundach oraz rozmiar pakietu IP pcapPola = TracesPlay('-o HEADER.timeS HEADER.timeUs IP.len -r test.pcap'); czas = double(pcapPola(1,:))-double(pcapPola(1,1)); %Normalizacja czasu czas = czas + double(pcapPola(2,:))*10^-6; %Dodanie czynnika mikrosekund tmp = cumsum(double(pcapPola(3,:))); %Obliczanie szybkości bitowej tmp =(tmp(10:10:end)-[0 tmp(10:10:end-9)])./(czas(10:10:end)-[0 czas(10:10:end-9)]); plot(czas(10:10:end), tmp) %Generowanie wykresu z opisem osi xlabel('Czas przybycia ostatniego z 10 pakietow'); ylabel('Szybkosc bitowa kolejnych 10 pakietow');
Przykład 19.5
Przykład 19.5 (plik przyklad_19_5.m) prezentuje w języku MATLAB najprostszy model oparty na analizie pakietów, obliczający prawdopodobieństwo straty na podstawie numerów sekwencyjnych protokołu RTP.%Przykład 19.5 %Wpływ strat pakietów seqName='animacjaSRC16.yuv_1000.pcap_5.pcap'; %Nazwa analizowanego pliku runStr = sprintf('-o RTP.seqNum -r %s', seqName);%Komenda przekazana do TracesPlay-a seqNum=TracesPlay(runStr); %Odczytanie śladu ruchu seqNumDif = seqNum(2:end)- seqNum (1:end-1)-1; %Obliczanie różnic numerów sekwencyj. p=sum(seqNumDif )/length(seqNum); %Obliczenie prawdopodobieństwa straty QoE=4*exp(-104*p)+1; %Podstawienie wartości do modelu fprintf('Sekwencja %s ma straty %2.2f%%, oszacowany poziom QoE wynosi %.3f\n', ... seqName,p*100, QoE); %Wydruk uzyskanego wyniku
Przykład 19.6
Przykład 19.6 (plik przyklad_19_6.m) prezentuje w języku MATLAB model analizujący liczbę danych przesyłanych w strumieniu wizyjnym i estymujący jakość z tej informacji.%Przykład 19.6 %Uwzględnienie kompresji bitRate=TracesPlay('-o HEADER.timeS HEADER.timeUs IP.len -r animacjaSRC16.yuv_200.pcap_0.pcap'); czas = double(bitRate(1,:))-double(bitRate(1,1)); czas = czas + double(bitRate(2,:))*10^-6; len = double(bitRate(3,:)); czasMax = floor(czas(end)); %Ustalenie pełnych sekund jakie są w śladzie ruchu bitRateEst = zeros(1,czasMax); for j=1:czasMax, bitRateEst(j) = sum(8*len(czas>j-1 & czas >j)); %Suma długości pakietów ... %w zakresie j-1 do j end k = mean(bitRateEst)/1000000; %Przeliczenie wyniku na megabity na sekundę QoE=5-4*exp(-2.055*k); %Wzor 19.9 fprintf('Sekwencja animacjaSRC16.yuv_200.pcap_0.pcap ma średnią przepływność %.1f kbit/s, oszacowany poziom QoE wynosi %.3f\n', k*1000, QoE);
Przykład 19.7
Przykład 19.7 (plik cvqm.m z archiwum cvqm_src_v30.zip) pokazuje w języku MATLAB działanie skryptu cvqm.m.% Przykład 19.7 cvqm ’’’original.avi’’’ ’’’processed.avi’’’ ’’’progressive’’’ ’’’none’’’ ’’’vqm_vfd’’’