このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
非参照のイメージ画質メトリクスの比較
この例では、さまざまなブラインドまたは非参照のイメージ画質メトリクスのパフォーマンスを比較する方法を説明します。
イメージの画質の評価は、イメージの取得、圧縮およびその他のイメージ強調ワークフローの重要な部分です。画質の主観的な尺度を厳密に模倣する、高速で自動化されたメトリクスを用意することが望まれます。この例では、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
圧縮したイメージを拡大して、特定のアーティファクトの特徴を確認します。JPEG 品質 10 では、ブロック アーティファクトが顕著に見られます。
h1.XLim = [650 700]; h1.YLim = [490 550];
圧縮した 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
ビデオによるさまざまな圧縮率と内容に対する応答の評価
ストリーミング ビデオのようなアプリケーションでは、初期状態にある元のサンプルにアクセスできない可能性のあるレシーバーで、画質メトリクスを評価する必要があります。また、各フレームの内容も大きく変化する可能性があります。そのようなシナリオをシミュレートして、これらのメトリクスのパフォーマンス特性を評価してみましょう。
ビデオ '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')
ビデオのフレームごとに、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
参考
fitbrisque
| brisqueModel
| niqe
| niqeModel
| fitniqe
| brisque