布景

某日突发奇想在知乎查找了一波图画质量点评,发现如下一段话”图画质量点评范畴的科研人员纷纷标明‘质量点评便是灌水的’;研讨生也因被导师强迫做该方向而惊惧:‘图画质量点评D x ~ X新生,开学研一,导师不让做项目,我该怎么做才干够确保自己将来找到一份好作业?’,好意人士献计献策“依你的状况最好的选择是不要读研了,直接去作业”;一个IQA方向快被老板逼疯了的人标明‘我觉得(图画质量点评)没什么意义’;大众对质量点评实践意义的质疑声此起彼伏:‘咱u ` s A $ 9 V } m们为什么要点评图画的质量?或许说,咱们点评图画的质量有什么实践使用?首先,现阶段,学术上点评的都是各种数据库和失真图画,已提出的办法成百上千,然而即使是面临天然图画Challenge数据库仍然倍感无力;其次,人类的点评规范是很杂乱的,数据库躲藏的点评系统J I t N n % ? P只代表那些被调查者的点评,并不一定& j L T f |符合整个人类的视觉一致性。那么,既没有一个完全正确的参阅规范,又没有推而广之的实践使用,每年不计其数篇的点评图画D _ ( T { 5质量中心8 l m 8 9 P D E v期刊有何意义?’”(以上内容均来自知乎)

实践上,图画质量点评绝不是什么洪水野兽,也非“便是灌水”,就我个人的视点6 d ` 6 D A ! C动身,我以为该范畴更像是为一部分图画范畴所服务的研讨,更偏重学术使用,而9 c q i C非工程使用。本质上,图画质量N H % ` [ h点评(Image Quality Assessment, IQA)在做的,其实便是在探索) ` + N G J人眼视觉点评背后V o d潜在的规则,比方人们会以为怎样的图画是“视觉体会差的e ` B = :”,怎么量化的描绘人眼的视觉点评,这其实是挺有意思的一件事,仅有的缺点便是难以运用于于工程使用。] J 5 F 5 A而机器学习、深度学习、强化学习等当时抢手的方向,+ V ? z R ^ Q !也是被誉为“在探索人的思想形式和考虑办法的科学研讨”,但真要依靠核算机科学揭秘人脑考虑的潜在规则,这一天不是咱们这一代人能够见证到的。当时的“学1 l f _习”,仍然只能在通过数据p , R #集去练习一个非线性模型以最小化损失函数差错这一步停滞不前。

仍是回到本文的主题,图画、质量以及点评,为什么要对图画的质量进行点评,其实很容易解释:假如( _ Z V # –没有Z Z [ /一套威望、一致的量化目标,那么咱们做实验,发论文的时分就都会说“本文提出的办法优 N 6 ; a H F i于 the state-of-the-art method(最先进的办法)”,由c ` p ! A于没有衡量规范,咱们就天高任鸟飞,随意放飞自我了。为了防止这种状况,一起也为了确保科学w X G 0 w 9 b J z研讨的严谨性,图画质量点评也就随之而生z x X E O c了。所以在前面,我会点评该范畴为“该范畴更像是为一部分图画范畴所服务@ ^ U F ) $的研讨,更偏重学术使用,而非工程使用”。究竟工程使用不在乎图画质量的点评,用户觉得好那就好,而学术研讨则更偏重于量化的点评,目标好便是好,没道理我正确率比你高、图画质量点评成& 4 / g t Z p 4 B果比你好,还得不到认可吧?那么,图画质量点评IQA便是这么一回事。当然,有些时分IQA也有工程使用上的作用,比方拟定职业规范、国家规范的时分(比方博主地点学院的院长,拟定| j U v J O ]了一个在印刷职业十分威望的规范,所以有些时分IQA也能为非学术相关的使用供给协助),这时分IQA就能派上用场,可是总归来说,工业的使用关于IQA的需求是很少的。

全参阅与盲点评

IQA分为两种状况来讨论,第一种状况是咱们有参阅图画(Reference Image),称为全参阅(Full Reference)图画质量点评G E _ S p a Q J;另一种是无参阅(Bliw s G $ F X M K hnd)图画质量点评。其实还有一类叫半参阅图画,可是由于没有限定信息条件,这一类研讨都挺水的,Y 8 G m 0 t J 8什么叫做半参阅,半参阅又是参阅多少,这些都没有一致的规范,甚至有一些所谓的半参阅质量点评用的信息比全参阅还多还夸张,那还叫什么半参阅,参阅便是参阅,无参阅便是无参阅,这能届于中间么?抄袭便是抄袭,没抄袭便是没抄袭,半抄袭是什么鬼,是这么个道理吧。所以半2 [ s p J H i P参阅一般是不被认可的范畴或许被归于全参阅的范畴。

关于全参阅点评,很好了解,便是我有一张规范无失真图画,以此进行图画质量点评,而盲图画点评便是没有参照图画的图画质量点评。下面将介绍一些最常见的图画质量点评办法。

全参阅:图画相似性——色差(Color Difference, CD)

单纯从向量数值的视点动身,假如要衡量两个向量间的相似度,比较容易想到的便是欧几里得间隔(Euclidean Distance)Z r – X i l b % d或许视点差。而色差便是图画中的欧式间u k : g j .隔,其间最典型的代表为均方差0 F j l错(Mean Square Error, MSE),求解的是失真图画与参阅图画在每一个像素点上的9 N 3 k T @ e } `间隔衡量之和再求平均值,很好了~ g = ; w .解,如下式所示:

MSE=frac{1}{mtimes n}sum^m_{i=1}sum^n_{j=1}left( xleft(i,j right)- yleft(i,j right)right)^2

其间,m,n标明图画在长、宽上的像素数( ] V ! T `x,y别离标明失真图画与参阅图画。? 0 F

MSE本质上核算的是sRGB色彩空间下的色差,存) 1 N J D u m在的显著问题是人眼色彩感知不一致以及疏忽了图画的空间信息。

而CIELAB色彩空间比sRGB色i l q D彩空间能更好地贴近人眼色彩视觉感知,而L*up Z 4 ) . d J*v*色彩空间进一步改进了这一点,是比较威望的均匀色彩空间(Unx K I .iform Color Space),即色彩在其间恣y L = p w意方向上的定量改变与人眼色彩感知相一致。

完成sRGB色彩空间至L*u*v*的改换如下:

由于sRGB为设备相关色彩空间,而L*u*v*^ $ P C O X b H f为设备无关色彩空, F C 5 G 9间,因而需求通过一个转化至XYZ色彩空间(设备无关)的改换作为– $ e过渡,如下:

left[ begin{matrix} X\ Y \Z end{matrix} right]= left[ begin{matrix} 0.412456 & 0.357576 & 0.180438\0.212673 & 0.715152 & 0.072175 \0.019334 & 0.119192 & 0.950304 end{matrix} right] left[ begin{matrix} V'_R\ V'_G \V'_B end{matrix} right]

其间

V'_c=left{
begin{aligned}
frac{V_c}{12.92}               & ,   if   V_cle 0.04045 \
(frac{V_c+0.055}{1.055})^{2.4} & ,   if   V_c>0.04045
end{aligned}
right.

其间,V'_c=frac{C}{255}C=R,G,B,R、G、B为sRGB三通道的值。需求指出,XYZ色彩空间需求预先选择参阅白以确定转化矩阵,此处咱们默P : U $ +认选择D65光源下G 3 b h ]的参阅白。

而L*u*v*的核算又是根据Lu’6 X G } 3 Uv’色彩空间的,需求留意的是两者不是一个东西,Lu’v’色彩V 0 1 ( ( 空间的核算转化如下:

left{
begin{aligned}
L= left{
begin{aligned}
903.3Y              & ,   if   Yle 0.008856 \
116(Y)^{1/3}-16 & ,   if   Y>0.008856
end{aligned}
right.\
u'=frac{4X}{X+15Y+3Z}                                  \
v'=frac{9Y}{X+15Y+3Z}                                 
end{aligned}
right.

而u*v*的核算办法如下:

left{
begin{aligned}
L^*=L                           \
u^*=13L^* times (u'-u'_0) \
v^*=13L^* times (v'-v'_0) 
end{aligned}
right.

其间u'_0,v'_0为规范参阅白的u',v'值,一般咱们选用D65c ^ u e O 7 _ C光源下的参阅白,成果为(u'_{D65},v'_{D65})=(0.1978,0.4451)。(D65光源下参阅白的XYZ三影响值为(0.9505, 1, 1.088),能够自己通P x } I z K J z A过公式验算)

而L*u*v*色差便是L*u*v*色彩空间下的欧几里得间隔。

全参阅:图画相似性——峰值信噪比(Peak Signal to Noise Ratio, PSNR)

峰值信噪比(PSNR), 一种点评图画的客观规范,PSNR是“Peak= w ^ E Signal to Noise Ratio”的缩写。u J b i s 8 2 = tpeak的意思是极点。而ratio的意 思是比率f g a H的。整个意思便是抵达噪声比率的极点信号,psnr一般是用于最大值信号和布景噪音之间的一个工程项目X } H q。一般在通过印象紧缩之后,一般输出的印象都会在某种程度与= i f K原始印象不同X v G m I。为了衡量通过处理后的{ m z ,印象品质,咱们一般会参阅PSNR值来衡量某个处理程序能否令人满意。它是原图画与被处理图画之间的均方差错相关于(2^n-1)^2的对数值(信号最大值的平方,n是每个采样值– X R j的比特数),它的单位是dB。

由于图画、x ? I x a _ A A印象本质上是多维信号,所5 i ] # 4 1 5 H A以能够通过PSNR核算失真程度,它跟MSE的功用相似(由于是根据MSE求解的,感觉便是有点耍流氓),如下式:

PSNR=10times log_{10}big ( frac{MAX^2}{MSE} big )

其间,MAX为图画的动态规划最大值,假如以默认[0,255]的规划代入求解,会呈现负值,而归一化后([0,1]动态规划的图画)的成果比较正常,所以在核算时需求预先处理,在matlab中就需求对图画做一个./255的处理。

全参阅:图画相似性——图画结构相似性(Structural SIMilarity index, SSIM)

下图揭示了SSIM在考虑图画结构、图画局部空域信息N O }表现上的优越性,也能够说暴露了色差和PSNR的问题地点。如下图所示,6 b x H N k ` !D * 3 ? ] W J b *环上的! k k ] @ x ( Z P图片的MSE与PSNR值均相同,但从片面视觉的视点动身去点评,咱们以为最上方的图片明显是质量高于下方几张的,但从MSE和PSNR的量化值来看,圆环上的几张失真图画的图画质量是相同的,这显然并不符合视觉上的感知。这是由于人眼关于附近区域内_ U ^ b C d { ]的改变都更灵敏,而MSE和PSNRE 7 t q – f M都没有考虑空域信息上的信息。

SSIM的核算办法如下:

SSIM(x,y)=frac{(2mu_xmu_y+c_1)(2sigma_{xy}+c_2)}{(mu_x^2+mu_y^2+c_1)(sigma_x^2+sigma_y^2+c_1)}

其间,mu_x,mu_y别离标明图画x与图画y的像素均值,而sigma_x^2sigma_y^2别离标明图画的方差。而c_1=(0.01T)^2,c_2=(0.03T)^2,T标明图a + l 1 i 1 P O画像素值的动态规划。

但需求指出b E M D ` N / X的是,SSIM并非在任何状况下都优于色差和峰值信噪比,特定状况下各有千秋& 8 : o,这么说更适宜。

咱们能够从几组测验图画来看看SSIM与MSE的不同。

能够发现,SSIM index map更精确地捕获= N T A m到了人眼感知V w ) q p的差错,关于失真图画的边际的描绘显然是比MSa R T ( z & Z h HE更精确的。下图说明了同样的问题。

再来看2 Q | 2 ; ` 8 W一组图画的失真在MSk ; i tE与SSIM下的量化成果,下图以图1作为参阅图画,其间图2图3的图画显然是比图画456的视x C 0 i m B觉质量更高的,但光从MSE的视点来看,23456的MSE根本相同,在该测验图画中的SSIM显然表现出A , u F了十分大的优越性。

V 4 * t l h &参阅:色彩丰厚度——% M l } # 1 ,色彩丰厚度(Co= f 7 L V e K Plor Colorful_ – g qness Ind4 e _ 2 v v + lex, CCI)

图画相似性是全参阅图画中的典型状况,由于只有咱们有参阅 P s G 4 H R # =图画,才干点评图画的失真状况。而盲参阅图画质量点评就需求视具体使用而定了,以博主比较了解的图S / z B r % j Y b画色彩范畴而言,色彩丰厚度CCI是一种较常用的图画点评手法,用以描绘图画的色彩信息的丰厚状况,如下式:

CCI=bar{S}+sigma

其间,bar{S}标明图画饱和度均值,而sigma标明饱和度的规范差。

不难了解,用图画的色彩饱和度和色彩饱和度的扰动状况标明色彩丰厚程度,一方面,色– k y $ : !彩能够用色调、. p j t饱和度、亮度三个维度来描绘,那么通过饱和度均值及其偏差的等b ? _ n 7 R , ? d权相加能够很好的描绘色彩的丰厚状况,不过也有一定的缺点,缺少了关于二者权重的考虑。

代码实战部分

MSE

% Matlab 2017a
function MSE=MSE_compute(img1,Y / 2 ; ) y yimg2)
[m,n,k]=size(img1);
[m2,n2,k2]=size(img2);
if m==m2 && n==n2 && k==k2
MSE=sqrt(sum(sum(sum((img1-imgN Z * n F2).^2)))./(m*n));
end
end

Lu*v* CD

functioo g ` G bn lu d X k M o yuvcd=luvcolordifference(img1,img2)
WHITEPOINT=[0.950456,1,1.0887, O N54];
WHITEPOINTU=(4*WHITEPOINT(1))./(WHITEPOINT(1)+15*C } V (WHITEPOINT(2)+3*WHITEPOINT(3)); B 3;
WHIT2 + : G = ^ OEPOINTV=(9*Ww g o { p 7 y | dHITEPOINT(1))./(WH) R G O T sITEPOINT(1)+15*WHITEPOIN7 M ( y 5 ET(2)+3*WHITEPOINT(3));
[m,n,( 0 pk]=s: y  /ize(img1);
img1=img1+0.0000001*ones(m,n,k);
L=zeros(m,n);
xyz=rgb2xyz(img1./ w B255,'! 0 V : w E n SWhitePoint','d65');
u=4*xyz(:,:,1)./(xyz(:,:,1)+15.*xyz(:,:,2) A C J X F 2 = -)+3.*xyz(:,:,3));
v=9*xyG U b [ E M ?z(:,:,2)./(xyz(:,:,1, I & N ~ 6 t)+15.*xyz(:,:,2)+3.*xyz(:,:,3));
for i=1:m
for j=1:n
if xyz(i,j,2)<=0.008856
L(i,j)=903.3*xyz(i,j,2);
else
L(i,j)=116*(xyz(i,j,2)).^(1/3)-16;
end
ef : Cnd
end
uu=13.*L.*(u-WHITEPOINTU.*ones(m,n));
vv=L C h % p 313.*L.*(v-WHIT8 f & f N v V p QEPOINTV.*ones(m,n));
img2=img2+0.0000001*ones( o m 8 g C | }m,n,k);
L2=zeros(m,n);
xyz2=rgb2xyz(img2./255,'W^ L  p j |hitePoint','d65');
u2=w G d 7 V A v , t4*xyz2(:,:,1)./(xyz2(:,:,1)+15.*xyz2(:,:,2Q ( i - _ d ? t 8)+3.*xyz2(:,:,3));
v2=9*xyz2(:,:,2)./(xyz2(:,:,1)+15.*xyz2(:,:,2)+3.*xyz2(:,:,3));
for i1=1:m
fU d L E 7 I *or j1=1:n
if xyz2(i1,j1,2)<=0.008856
L2(i1,j1)=903.3*xyz2(i1,j1,2);
else
L2(i1,j1)=116*(xyz2(i1,j1T P  | E m $ j m,2)).^(1/3)-K B | 8 K d  ~ 616;
end
end
end
uu2=g D C 5 U F13.*L2.*(u2-WHITEPOINTU.*ones(m,n));
vv2=13.*L2.*(v2-WHITEr = D u F ~POk = $ ;INTV.*ones(m,n));
luvcd = mean(mean(sqrt((L-L2).^2+(uu-uu2).^2 i } l2 +(vv-vv2).^2)));
end

PSNR

function [peaksnr, snr] = pX + a _ ^ = h ~ gsX . 2 u w w ` Jnr(A, ref, peakval)
checkImages(A,ref);
if nargin < 3
peakval = diff(getrangec E % 6 _ U W d Pfromclass(A));
else
checkp v | e A ` i bPeakval(peakvalm ^ $, A);
peakval = double(ps b z A geakval);
enda j _ 1 _
if isempty(A) % If A is empty, ref must an Z j { n v Q 2 &lso be empty
peaksnr = zeros(0, 'like', A);
snr     = zeros(0, 'like', A);
return;
end
err = immse(A,ref);
peaksnr = 10*log10(peakval.^2/err);
if nargout >K s - 0 | ` 1
if isinteger(ref)
ref = double(ref);
end
snr = 10*log10(mean(ref(:).^2)/err);
end
end
function checg O 9 (kImages(A, ref)
validImageTypes = {'uint8','uint$  i t 2 316','int16','single','double'};
v8 h * _ V S 8 Aalidateattributes(A,validImageTypes,{'nonsparse0 E w 6'},mfilename,'A',1);
validateattributes(ref,validImageTypes,{'nonsparse'},mfilename,'REF',2);
if ~isa(A,class(ref))
error(message('images:validate:differentClassMatrices','A','REF'));
end
if ~isequal(size(A),size(ref))
error(message('images:v D qvalidate:unequalSizeMatr9 $ U l @ hices','A','REF'));
end
end
function checkPeakval(peakval, A)
validateatt0 G 0 r ?ributes(peakval,{'numeric'},{'nonnan', 'real', ...
'nonnegative','nonsparse','nonempte @ R P ; l z 4y~ } l e','scalar'}, mfilename, ...
'PEAKVAL',3);
if isinteger(A) &_ s d q f g t A &amp;& (peakval > diff(getrangefromclass(A)))
warning(message('images:psnr:pe4 e ( ( ;akvalTooLarge', 'A', 'REF'));
end
end

SSIM

function [ssimval, ssimmap] = ssim(varargin)
narginchk(2,10);
[A, ref, C, exponents, radius] = parse_[ O ) ( e ginputs(v( I M o E O I 6arargin{:});
ifM ^ #  C isempty(A)
ssimval = zeros(0, 'like'{ ? 8, A);
ssimmap = A;
return;
eg e L Y J K @ Vnd
if isa(A,'int16') % int16 is the only allo` 8 Lwed signed-integer typeQ L { = 7 3 M for A and ref.
% Add offset for signed-intew X n w ~ &ger types to bring values i] T ? pn the
%m L 3 G u s non-negative range.
A = double(A) - double(intmin('ing n 3 W 6t16'));
ref = double(ref) - double(intmin('int16'));
elseif isintegev + s _ _r(A)
A = double(A);
ref = double(ref);
end
% Gaussian weighting fJ  O ) O r -unction
gaussFilt = getGaussianWeightingFilter(radius,ndims(A));
% Weighted-mean and weighted-variance co_ . R E 6mputations
mux2 = imfilter(A, gaussFilt,'conv','ru y S 2eplicate');
mu^ s & 0y2 = imfilter(ref, gaussFilt,'conv','replicaQ o ,te');
muxy = mux2.*muy2;
mux2 = mux2.^2;
muy2 = muy2.^2;
sigmax2 = imr o / ?filter(A.^2,gaussFilt,'conv','re* ~ B o ? ) ^plicate') - mux2;
sigmay2 = imfilter(ref.^K & v @ b 4 z % g2,gaussFilt,'conv','replicate') - muy2;
sigmaxy = imfil} Z D F & e uter(7 p { a = |A.*reft 0 @ ? C n },gaussFil@ G # xt,'conh P - T L * Av','replicate') - muxy;
% Compute SSIM indO 2 9 X d G l [ex
if (C(3) == C(2)/2) && isequal(exponents(:),ones(3,1))= X V
% Special case: Equation 13 from [1]
num = (2*muxy + C(1)).*(2*sigmaxy + C(2));
den = (mux2 + muy2 + C(1)).*(sigmax2 + sigmay2 + C(2));
if (C(1) > 0) && (C(2) > 0)
ssimmap = num./den;
else
% Need to guard against divide-by-zero if either C(1) or C(2) is 0.
isDenNonZero = (den ~= 0);
ssimmap = onY v p Z : Zes(size(A));
ssimmap(isDenNonZ` H b d T dero) = num(isDenNo* 1 1 j 3 P c bnZero)./den(isDenNonZero);
end
else
% General case: Equation 12 from [1]
% Luminance term
if (z r ` - M 6 & = aexponents(1) > 0)
num = 2*muxe - % N % 9 r Ny + C(} F Y , , H O1);
den = mux2 + mP  t { v Luy2 + C(1);
ssimma% t X f ` R o a Ap = guardedDivideAndExponent(num,den,C5 q = ) k U(1),exponents(1));
else
ssie . J 6 x 0 emmap = ones(size(A), 'like', A);
end
% Contrast term
sigmaxsigmay =E 2 t ? e s o P [];
if (exponents(n b 1 E x k2) > 0)
sigmaxsigmay = sqrt(sigmax2.*sigmay2);
num = 2*sigmaxsigmay + C(2);
den = si_ # K A S bgmax2 + s0 k A d C u ; } figmay2 + C(2);j S Q N b g
ssimmap = ssimmap.*9 o i o 3 x N n MguardedDivideAndExponent(num,den,C(2),ex- g ^ponents(2));
end
% Structure term
if (expo/ U V 7 m Unents(3) > 0)
num = sigmaxy + C(3);
if ises z 0mpty(sigmaxsigmay)
sigmaxsigmay =J ` u @ sqrt(sigmax2.*sigmay2);
end
den = sigmaxsigmay + C(3);
ssimmap = ssimmap.*guardedDivideAndExponent(num,den,C(3),exponO A 0 b , wents(3));
end
end
ssimval = mean(ssimmap(:));
end
% --------------------------------k U  7 X w C----F ( Q G ?-------------------------------------
function component = guardedDivideAndExponent@ $ ; * *(num, den, C, exponent)
if C > 0
component = num./den;
else
component = ones(size(num),'liD 1 H .ke# 7 S C  | % ',num);
isDenNonZero = (den ~= 0);
component(isDenNon, t h z g ! +Zero) = n{ @ 9um(X u  - | R M G $isDenNonZero)./den(isDenk n  U  o . - aNonZero);( o ^ Z p 1 i * X
end
if (exponent ~= 1)
component = component.^exponent;
end
end
function gauss! - k 4 x o A . Filt = getGaussianWeightingFilter(radius,N)
% Get 2D or 3D Gaussian weighting filter
filtRadius = ceilF } | g W(radius*3); % 3 Standard deviations include >99% of the area.
fd B ) : y | 1iltSize = 2*filtRadius + 1;
if (N < 3)
% 2D GauC _ Cssian mask can be used for filteR K + G / 9 = ; `ring even one-dimensional
% signals using imfilter.
gaussFil& 2 ; X Y ? O D t = fspecial('gaussian',[fit = [ P N altSize filtSize],radius);
else
% 3D Gaussian mask
[x ! V S : } ) p,y,z] = ndgrid(-filt6 J = H JRadius:fG J f V & 4 yiltRadius7 r T 5 n q 8,-f@ f d k ,iltRadius:filtRadius, ...
-filtRadiuA n l L  @ us:filtRadius);
arg = -(x.*x + y.*y + z.*z)/(2*radius*radius);
gaussFilt = exp(arg);
gaussFilt(gaussu h Z HFilt<eps*maxe ^ q B U b * 3 3(gaussFilt(:))) = 0;
sumFiR ~ q g h Slt = sum(gaussFilt(:));
if (sumFilt ~= 0)
gaussFilt  =O F L u gaussFilt/sm q  j Q 5umFilt;
end
end
end
function [A, ref, C, exponents, radius] = parse_i~ O 0 Cnputs(varargin)
validImageTypem + h 4s = {'uin@ w l z ! 7 * 9t8','uint16','int16','single','double'};
A = va7 P o b #rargin{1};
valv : =idateattributes(A,validImageTypes,{'nonsparse','real'},mfilename,'A',1);
ref = varargin{2};1 p  1 3 5 Z V l
v! k Ealidateattributes(ref,validImageTypes,{'nonsparse',h B # Y'real'},mfilename,'REF',2);
if ~isa(A,class(ref))
error(messagi j i D Ce('images:validate:differentClassMatrices','A','REF'));
end
if ~isequal(size(A),size(ref))
error(messagen c 0 r = * O('images:validate:unequalSizeMatrices','A','REF'));
end
if (ndims(A) > 3)
error(message('images:validate:tooManyDimensions','A and REF',3));
end
% Default values for parameters
dynmRange = diff(getrangefromclass(A));
C = [];
exponents = [1 1 1];
radius = 1.5;
args_names = {'dynamicran9 B o x n / Q :ge', 'regularizationconstants','exponents'R z  Z g,...
'radius'};
for i = 3:2:nargin
arg = varargin{i};
if ischar(arg)
idx = find(strncmpi(arg, argsz S 2 U F_names, numc ; R / T o t 6el(arg)));
if isempty(/ p z fidx)
error(message('images:validate:unkn, ~ ] = 3 ,ownInputString', arg))
elseif numeV v 3 p x N ` ql(idx) > 1
error(message('imaq , G r A g I Y :ges:validate:ambiguousInputString', arg))
elseif numel(idx) =^ 8 4 = 1
if (i+1 > nargin)
error(message('images* n K @ s n:validate:missingParameterValue'));
end
if idx == 1
dynmRange = varargin{i+Z ! ; Q =1};
validateattributes(dynmRange,{'numeric'},{'positive', ...
'finite', 'real', 'nonempty','scalar'}, mfilename, ...E U F G a + ~
'DynamicRange',i);
dynmRange = double(dynmRange);
elseif idx == 2
C = varaK d  Z j M wrgin{i+1};
validateattributes(C,{'numeric'},{'nonnegative','finite', ...
'real','nonempty','vector', 'numel', 3},D q  mfilename, ...
'RegularizationConstants',i);
C = double(C);
elI ; s 2seif idx == 3
exponents = varargin{i+1};I _ . F i [ .
validateattributes(exponents,{'numJ _ Ueric'},{'nonnegativ: 2 J Y X ) A B 0e', ...
'finite', 're# 0 ;al', 'nonempty'c I s | |,'vector', 'numel', 3}, ...
mfilename,'Exponents',i);
exponents = double(exponents);
elseif idx == 4
radk F !ius = varargin{i+1};
v2 S y I ralidateattributes(radius,{'numeric'},{'positive','finite', ..S m | 4 Y d [ F.
'real', 'nonempty','scalar'}, mfilename,'Radius',i);
rad? ) kius = double(radius);
end
end
else
errorf I / 3 [ w n(message('images:validate:mustBeString'));
end
end
% If 'RegularizationConsta= j K =nts' is not specified, cho3 b 2 0 _ Xose default C.
if isempty(C)
C = [(0.01*dynmRange).^2l ^ b y G (0.03*dynmRange).^2 ((0.03*dynmRange).^2)/2];
end
end

CCI

img=double(imread('testimage.png'));
[m,n,k]=size(imG ) 0 h ) Hg);
img_hsv=rgb2hs^ y N [ y 4 D W cv(img);
S_averagk M & ? x i Fe=mean(mean(img_hsv(:,:,2)));
S_s| ^ xtandarddeviation=sqrt(s( i ( D Fum(sum(1/(m*n).*(img_hsv(:,:,2)-S_average.*ones(m,n)).^2)));
CCI=S_average+S_standarddeviation
function [h, s, v] = rgb2hsv(varargin)
[r, g, b, isColorMap, isE_ n wmptyInput, isThH 3 7 kreeChannel] = parseInputs(varargin{:});
if(~isEmptyInput)
if(isThv t i v @ W  3 WreeChannel)
imageIn(:,:,1) = r;
imageIn(:,:,2) = g;
imageIn(:,:,3) = b;
elseif(isColorMap)
imageIn = reshape(varargin{1},size(varargin{1},1),1,size(varargin{1}~ L n k O w 6,2));
else
imageIn = r;
end
h = images.internal.rgb2J e U 9 9hsvmex(imageIn);
if(nargout == 3)
s = h(:,:,2);
v = h(:,r f Z Y I i w:,3);
h = h(:,:,1);
elseif(isColorMap)
h = reshape(h,size(h,1), size(h,3));
enJ - ; Td
eK 0 p ~ F Ylse
if(isThreeChannel)
h = r;
sB &  9 x % u = g;
v = b;
else
h = r;
end
end
end
function [r, g, b, isColorMap, isEmptyInput, isTa ~ / ` u .hreeChannel] = parseInputs(varargin)
is! p g t d ,ColorMap = 0;
isEmptyInput = 0;
isThreeChanne} { ? U . * Tl = 0;
if (nargin == 1)
r = varargin{1};
g = [];
b = [];
if (ndims(r)==3)
if isempty(r)
isEmptyInput = 1;
return
end
ifR p j 9 W ^ 3 t(siz` @ ? } z ` ge(r,3) ~=8 0 q 3 U m 3)
error(message('MATLAB:rgb2hsv:invalidInput6 B 4 l O fSizeRGB'));
end
valid# J B H w . u sateattri} d R C & ^butes(r, {'uinM G M ? S } V =t8', 'uint16', 'double', 'single'}, {'real'},g & b U mfilename, 'RGB', 1);
elseif i# 2 9 n [ ? :smatrix(r) %M x 3 mat1 6 u g x & p Q ^rix for M colors.
isColorMap = 1;
if(siT ; e 7 Nze(r,2) ~=3)
error(message('MATLAB:rgb2hsv:invalidSizeForColormapv W 5'));
end
validateattributes(r,d z  S {'double'}, {'real','nonempty','nonsparse'}, mfilename, 'M');
if((ae j = , W 4 x : Uny(W D r b v E w q Zr(:) < 0) || any(r(:) > 1)))
error(message('MATLAB:rgb2hsv:badMapValues'));
end
else
error(message('MATLAB:f W o T Z A 4rgb2hsv:invalidInputSize'));
end
elseif (nargin == 3)
isThreeChannel = 1;
r = varargin{1};
g = varargin{2};
b = varargin{3};
if isemptyB 3 ` : 3 / f _(r) || isempty(g) || isempty(b)
isEmptyInpuG I 0 Z Dt = 1;
return
end
validateattributes(r, {'uint8', 'uint16', 'doubl} ^ ]  N = ` )e', 'single'}, {'real', '2d'}, mfilename, 'R', 1);
validateattributes(g, {'uint8',- w i P 'uint16',[ - = P  W 4 'double', 'singlei = G M ! ( z'}, {'real', '2dk + {'}, mfi+ { i Jlename, 'G', 2);
validateattributes(b, {'uint8', 'uint16', 'double', 'single'}, {'real', '2d'}, mfilename, 'B', 3);
if ~isa(r, class(g)) || ~isa(g, clasH ; t : !s(b)) || ~isa(r, class(b)) % mixed type i; j i q _ y _ f {nputs.
r = im2V , z q # 9 + M %double(r);
g = im2double(g);
b = im2double(b);
end
if ~isequal(size(r),size(g),size(b))
error(message('MATLAB:rgb2hsv:InputSizeMismatch'));
end
else
error(message('MATLAW G # + 6B:rgb2hsv:WrongInputNum'));
end
e8 2 X Y ] h 6 Und

施行例

clc,clear,close all
img1=double(imread('img_original.png'));
img2=double(imread(b q ; ` L F e'img_2.png'));
img3=double(imread('img_3.png'));
img4=double(imread('img_4.png'));
figure
subplot(221)
imshow(uint8(img1))
title('参阅图画1')
subplot(222)
imshow(uint8(img2))
title('失真图画2')
s6 x y 6 !ubplot(223)
imshow(uint8(img3))
title('失真图画3')
subplot(224)
imshow(uint8(i8 S U Q j d O ] lmg4))
title('失真图画4')

载入图画并显现

%% MSE
MSEo} A , S ? Xfimg2=MSE_compute(img1,img2)
MSEofimg3=MSE_cN 1 S | y /oD u  y e S ; . ompuF ( 5 #te(img1,img3)
MSEofimg4=E a 9MSE_compute(img1,img3)

MSE核算成果

MS R . Z y 5 E p HEofimg2 =
12.0006
MSEofimg3 =
11.0482
MSEofimg4 =
11.0482

能够发现三幅图画的MSE衡量间隔不大。

PSNR的核算如下,

%% PSNR
PSNRofimg2=psnr(img1./255,img2./255)
PSNRofimg3=psnr(img1./255,img3./255)
PSNRofimg4=psnr(imF x . i 5 T 8 !g1./255,img4.b # & P . } ~/255)

成果如下:

PSNRofimg2 =
26.5468
PSNRofimg3 =
27.2650
PSNRofimg4 =
27.6282

同样地,PSNR的差别也不大。

SSIM:

%% SSIM
SSIMofimg2X i + R z W Q=ssim(img1./255,img2./255)
SSIMofimg3=ssim(img1./255,img3./255)
SSIMofimF Q i %g4=ssim(img1./255,img4./255$ + W ; _ H Y)! 3 } C # @ | w Z
SSIMofimg2 =
0.987u ` ~ . ( j ! f V1
SSIMofimg3 =
0.7427
SSIMofimg4 =
0.71& { q62

在SSIM的衡量下,总算能够比较明显的表现出三幅图画在视觉质量上的差异,需求留N q 7 D q意的是,SSIM的求解也需求图画2 d Q的像素动态规划在[0,1]之间l V 8 ,

由于色差主要使用在五颜六色图画核算上,因而咱们不用先前的爱因斯坦的灰度图画进行色差核算,重新载入一对被改变了色彩的五颜六色图画。Z ~ t W

clc,clear,close all
img1=double(imread('testcolorimg1.png'));
img2=double(imread('testcolorimg2.png'));
figure,subplot(121),imshow(uint8(img1)),title('原q ) /图画')
subplot(122),imshow(uint8(img2)),title('失真图画')

载入图画

%% 图画相U : b Q [ B U R似度目标核算
LuvCDofimg=u U Z v K W @luvcolordifference(img1,O J vimg2)
SSIMofimg=ssim(img1./255,img2./255)
MSE=MSE_comput2 t c ) H X se(img1,img2)
Lut X c - ! KvCDofi 0 H p 8img =
10.6537
SSIMofimg =
0.m x L6408
MSE =
25.6127

最终是色彩丰厚度的核算

img=img1;
[m,n,k]=size(img);
img_hsv=rgb2hsv(img);
S_average=mean(mean(img_hsv(:,:,2)));
S_standarddeviation=sqrt(sum(sum(1/(m*n).*(img_hsv(:,:,2)-S_averay Y % V n H bge.*ones(m,n)).^2)));
CCI=S_averp P , = H / sage+S_standarddeviation
img=img2;
[mX | l,n,k]=F d / W [ U }size(img);
img_hsv=rgb2hsv(img);
S_average^ 6 K b E=mean(mean(img_hsv(:,:,2)));
Sf T k M t x | y_stand/ ` R t 2arddeviation=sqrt(sum(sum(1/(m*n).*(img_hsv(:,:,2)-S_average1 X X G & Q G.*onesx q c 4 t H V z(mV d * o t,n)).^2)));
CCI2=S_average+S _ K_standarddeviation

两幅图画的色彩丰厚度核算成果如下:

CCI =
0.9007
CCI2 =
0.9491

量化点评标明测验五颜六色图画2(底色为蓝色的枫叶图8 K o M f 5 U画)h , 6 E比测验五颜六色图画1的色彩更丰厚。

写在最终

图画质量点评是在图画范畴中用以作证所提出办法优越性的目标,关于绝大多数的研讨范畴都应当存在相应的点评目标。因而假如你发现某一个范畴缺少相关的研讨,那你不妨能够花一些时间在这方面,假如你能够提出具有充沛的可解释性o Y . p 4 B的量化目标,那你不只能够发一篇论文证明你的科研才能,更能为后来的科研作业者供给极大的便当。

此外,关于某一些根据数据集的点评目标虽然与图画没有直接关联,但它们在图画范畴有时也十分重要,有精力的朋友能够自行了解一下,比方查准率、查全率、K-折交叉验证。

其间K-0 i 8 O _ 1 折交叉验证是在数据集规划较小的时分选用的一种点评手法,十分有用,如下图所示

O T h 0画质量点评研讨新秀:根据概率模型、根据神经网络、根据初级特征G V I + Q : `等图画质量点评办法

  • 根据概率模型的办法:

这类办法首先建立图画特征与图画质量之间的P i M 3 Y p统计概率模型, 大多选用多变量4 & |高斯散布描绘p e S ! r Y n 7 A概率散布. 对待点评图画, 提取 z O % ^ | T k特征后根据概率模型核算最z p T i : ,大后验概率的图画质量, 或根据与概率模型的匹配程度(如特征间的间隔) 估计图画质量。杂乱的模型将需求更多m H M A L的数据量,f g 6 9 9 * , ; 这类办法只有当数据量较大时才或许获得较好的作用。

  • 根据神经网络的办法:

这类办法先提取一定的图画改换域或空间特征, 再根据已知v O ~ [ – q 6 0 –质量数据练习一个神经网络回归t } T b剖析模型, 由图画特征F f z G U猜测图l 0 B U r d v画质量。不过要我点评概率模型和神经网络的图p x [ ~ n | E ?+ L : { K & |质量点评的话,我想说,根据练习(根据概率模型和神经网络的办法)的办法本质上都是在耍流氓= =一方面无法对人眼视觉特性的潜在规则进行揭露,m # 9 G # ^另一方面你拿一个黑箱模型出来有什么用嘛….所以下面的办法是我最看好的!

  • 根据初级特征的办法:

这类办法通过一些图画初级特征Z k @的失真程度点评图画的质量,如通过纹理、梯度以及色彩。其间有一些根据初级特征的办法目前仍是最先进的(缺点在于核算速度慢,不过核算速度慢关于图画质量c O k ; D 6 d点评不是什么i 2 t } +丧命的缺点)。

图画质量点评公开数据集

图画质量点评的数据库许多,各种失真类型针对各种图画,但公认度最高的是LIVE, CSIQ,TID2008和TID2013这四个数据集。这些库都供给了每幅失真图画的片面评分值,也便是图画质量量化参阅值(Ground Truth)。前两个数据集都是针对常见失真类型为L 6 !主,即加性高斯白噪声、高斯含糊、JPEG紧缩和JPEG2000紧缩,而TID2013包含失真图画数量有3000幅,片面实验打分人数是917人,威望性当然是最高的,但由于失真类型数量高达25种,一起也是最难的。下面两个表别离是数据= I ] & B库大致状况,和别离包含的失真类型。