Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

非参照のイメージ画質メトリクスの比較

この例では、さまざまなブラインドまたは非参照のイメージ画質メトリクスのパフォーマンスを比較する方法を説明します。

イメージの画質の評価は、イメージの取得、圧縮およびその他のイメージ強調ワークフローの重要な部分です。画質の主観的な尺度を厳密に模倣する、高速で自動化されたメトリクスを用意することが望まれます。この例では、3 つの非参照画質メトリクスのパフォーマンスを比較します。

  • BRISQUE - Blind/Referenceless image spatial quality evaluator

  • NIQE - Naturalness image quality evaluator

  • PIQE - Perception-based image quality evaluator

各メトリクスには、データセット内のイメージに応じて異なる長所があります。使用するデータに最適のメトリクスを選択するには、サンプルのイメージ データに対する 3 つのメトリクスのパフォーマンスを比較します。この例では、1 つのイメージおよびビデオ ストリームで JPEG 圧縮レベルを変化させるという 2 つの異なる状況でパフォーマンスを比較する方法を説明します。

1 つのイメージ上でのさまざまな圧縮率に対する応答の評価

イメージの圧縮は、表示品質と圧縮率、つまり出力データのサイズとの間のトレードオフです。このトレードオフは、イメージの内容によっても異なります。たとえば、一様な領域を持つイメージを圧縮するとファイル サイズをより小さくでき、細かい特徴を持つイメージより表示されるアーティファクトが少なくなります。イメージ画質メトリクスは分析に対するイメージの内容の影響を最小限に抑えようとすると同時に、このトレードオフの分析に役立ちます。

イメージをワークスペースに読み取ります。

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

Figure contains 3 axes objects. Axes object 1 with title JPEG Quality: 10 contains an object of type image. Axes object 2 with title JPEG Quality: 70 contains an object of type image. Axes object 3 with title Input Image contains an object of type image.

圧縮したイメージを拡大して、特定のアーティファクトの特徴を確認します。JPEG 品質 10 では、ブロック アーティファクトが顕著に見られます。

h1.XLim = [650 700];
h1.YLim = [490 550];

Figure contains 3 axes objects. Axes object 1 with title JPEG Quality: 10 contains an object of type image. Axes object 2 with title JPEG Quality: 70 contains an object of type image. Axes object 3 with title Input Image contains an object of type image.

圧縮した JPG イメージごとに、3 つの画質メトリクスを使用して画質スコアを計算します。

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 品質の昇順に可視化します。各スコアが非圧縮イメージに対して同じ値を持つようにスコアを正規化します。これら 3 つのメトリクスの場合、スコアが小さいほど画質が高くなります。

JPEG 品質が 50、60、70 の BRISQUE スコアは、非圧縮 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

Figure contains an axes object. The axes object with xlabel JPEG Quality, ylabel Metric Score contains 3 objects of type line. These objects represent BRISQUE, NIQE, PIQE.

ビデオによるさまざまな圧縮率と内容に対する応答の評価

ストリーミング ビデオのようなアプリケーションでは、初期状態にある元のサンプルにアクセスできない可能性のあるレシーバーで、画質メトリクスを評価する必要があります。また、各フレームの内容も大きく変化する可能性があります。そのようなシナリオをシミュレートして、これらのメトリクスのパフォーマンス特性を評価してみましょう。

ビデオ 'rhinos.avi' からフレームを読み取る VideoReader オブジェクトを作成します。このビデオには 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')

Figure contains an axes object. The axes object with title JPEG Quality Schedule, xlabel Frame Index, ylabel JPEG Quality contains an object of type line.

ビデオのフレームごとに、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

Figure contains an axes object. The axes object with title Trend of Quality Metrics with Varying Compression and Content, xlabel Frame Index, ylabel Metric Score contains 4 objects of type line. These objects represent BRISQUE, NIQE, PIQE, Compression Ratio.

参考

| | | | |

関連するトピック