一、簡介
新的模型稱之為NIQE(Natural Image Quality Evaluator),這個模型的設計思路是基于構建一系列的用于衡量影像質量的特征,并且將這些特征用于擬合一個多元的高斯模型,這些特征是從一些簡單并且高度規則的自然景觀中提取;這個模型實際上是衡量一張待測影像在多元分布上的差異,這個分布是有一系列的正常的自然影像中提取的這些特征所構建的,
1 構建模型
空間域上的特征,稱之為Spatial Domain NSS
按照如下的方式進行計算,首先是提取影像中的一個個patch,然后做下面這樣的一個歸一化

這里的μ \muμ就是高斯權重,在最初的設計中這里的高斯權重是一個3x3的模板;看到上面的公式,這里就很明確了,上述實際上一個基于高斯平均值以及高斯標準差的一個歸一化計算,相對于其他的一些指標,NIQE僅僅是計算正常的自然影像中的這個指標,毫無疑問的是不正常的影像多多少少會在這個指標上同正常影像的計算值會有一個歧離,從這個意義上講,理論上NSS 可以適用于各種影像退化種類,基于這種思想設計的IQA可以權衡各種影像退化,而不是像某些指標那樣僅僅是在某些退化種類上有很好的的表現,
patch的選擇
如果需要計算上述的NSS指標,毫無疑問的是會造成影像被分裂為一個一個的patch,在NIQE的演算法設計中,只有一部分patch是有用的,這就涉及到一個patch的選擇問題;這里實際上有一個啟發,比如我們關注一個解析度退化影像時,我們會挑選那些原本應該是sharp的區域邊緣進行觀察,判斷其解析度是否受損,而不會整個影像的所有patch都觀察一遍;這里定義了一種區域形變系數

這里的形變系數設定了一個閾值,在作者的實驗中,這個閾值設定的是0.75,大于0.75的patch 可以選入進行下一步計算;這一步的操作是很好理解的,因為畢竟往往是形變系數越大的patch說明里面的內容越復雜,換而言之說明這里的內容所包含的資訊更多,這里的σ \sigmaσ就是上面步驟所述的σ \sigmaσ計算
描述patch
之前的內容已經說明了patch的空間域特征以及如何選擇patch,現在的問題在于如何設計指標來刻畫我們選擇的patch,這種刻畫按照設計是一種借鑒高斯分布思想的指標,首先定義高斯分布型別的指標GGD



二、源代碼
function [mu_prisparam cov_prisparam] = estimatemodelparam(folderpath,...
blocksizerow,blocksizecol,blockrowoverlap,blockcoloverlap,sh_th)
% Input
% folderpath - Folder containing the pristine images
% blocksizerow - Height of the blocks in to which image is divided
% blocksizecol - Width of the blocks in to which image is divided
% blockrowoverlap - Amount of vertical overlap between blocks
% blockcoloverlap - Amount of horizontal overlap between blocks
% sh_th - The sharpness threshold level
%Output
%mu_prisparam - mean of multivariate Gaussian model
%cov_prisparam - covariance of multivariate Gaussian model
% Example call
%[mu_prisparam cov_prisparam] = estimatemodelparam('pristine',96,96,0,0,0.75);
%----------------------------------------------------------------
% Find the names of images in the folder
current = pwd;
cd(sprintf('%s',folderpath))
names = ls;
names = names(3:end,:);%
cd(current)
% ---------------------------------------------------------------
%Number of features
% 18 features at each scale
featnum = 18;
% ---------------------------------------------------------------
% Make the directory for storing the features
mkdir(sprintf('local_risquee_prisfeatures'))
% ---------------------------------------------------------------
% Compute pristine image features
for itr = 1:size(names,1)
itr
im = imread(sprintf('%s\\%s',folderpath,names(itr,:)));
if(size(im,3)==3)
im = rgb2gray(im);
end
im = double(im);
[row col] = size(im);
block_rownum = floor(row/blocksizerow);
block_colnum = floor(col/blocksizecol);
im = im(1:block_rownum*blocksizerow, ...
1:block_colnum*blocksizecol);
window = fspecial('gaussian',7,7/6);
window = window/sum(sum(window));
scalenum = 2;
warning('off')
feat = [];
for itr_scale = 1:scalenum
mu = imfilter(im,window,'replicate');
mu_sq = mu.*mu;
sigma = sqrt(abs(imfilter(im.*im,window,'replicate') - mu_sq));
structdis = (im-mu)./(sigma+1);
feat_scale = blkproc(structdis,[blocksizerow/itr_scale blocksizecol/itr_scale], ...
[blockrowoverlap/itr_scale blockcoloverlap/itr_scale], ...
@computefeature);
feat_scale = reshape(feat_scale,[featnum ....
size(feat_scale,1)*size(feat_scale,2)/featnum]);
feat_scale = feat_scale';
if(itr_scale == 1)
sharpness = blkproc(sigma,[blocksizerow blocksizecol], ...
[blockrowoverlap blockcoloverlap],@computemean);
sharpness = sharpness(:);
end
feat = [feat feat_scale];
im =imresize(im,0.5);
end
function quality = computequality(im,blocksizerow,blocksizecol,...
blockrowoverlap,blockcoloverlap,mu_prisparam,cov_prisparam)
% Input1
% im - Image whose quality needs to be computed
% blocksizerow - Height of the blocks in to which image is divided
% blocksizecol - Width of the blocks in to which image is divided
% blockrowoverlap - Amount of vertical overlap between blocks
% blockcoloverlap - Amount of horizontal overlap between blocks
% mu_prisparam - mean of multivariate Gaussian model
% cov_prisparam - covariance of multivariate Gaussian model
% For good performance, it is advisable to use make the multivariate Gaussian model
% using same size patches as the distorted image is divided in to
% Output
%quality - Quality of the input distorted image
% Example call
%quality = computequality(im,96,96,0,0,mu_prisparam,cov_prisparam)
% ---------------------------------------------------------------
%Number of features
% 18 features at each scale
featnum = 18;
%----------------------------------------------------------------
%Compute features
if(size(im,3)==3)
im = rgb2gray(im);
end
im = double(im);
[row col] = size(im);
block_rownum = floor(row/blocksizerow);
block_colnum = floor(col/blocksizecol);
im = im(1:block_rownum*blocksizerow,1:block_colnum*blocksizecol);
[row col] = size(im);
block_rownum = floor(row/blocksizerow);
block_colnum = floor(col/blocksizecol);
im = im(1:block_rownum*blocksizerow, ...
1:block_colnum*blocksizecol);
window = fspecial('gaussian',7,7/6);
window = window/sum(sum(window));
scalenum = 2;
warning('off')
feat = [];
三、運行結果

四、備注
完整代碼或者代寫添加QQ 1564658423
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/272234.html
標籤:其他
上一篇:PTA練習題5總結
下一篇:2021-04-03
