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’’’