广义高斯分布(GGD)和非对称广义高斯分布(AGGD)的形状参数快速估计
广义高斯分布(generalized Gaussian distribution,GGD)和非对称广义高斯分布( asymmetric generalized Gaussian distribution,AGGD)被经常使用与图像/视频信号的统计分析,其形状参数常被用为图像的特征进行分类或回归。如在图像质量评价任务中,Anish Mittal等人提出的BRISQUE模型利用GGD拟合归一化后图像(
0 引言
广义高斯分布(generalized Gaussian distribution,GGD)和非对称广义高斯分布( asymmetric generalized Gaussian distribution,AGGD)被经常使用与图像/视频信号的统计分析,其形状参数常被用为图像的特征进行分类或回归。如在图像质量评价任务中,Anish Mittal等人提出的BRISQUE模型利用GGD拟合归一化后图像(MSCN)的分布,利用GGD参数 ( α , σ 2 ) (α, σ ^2) (α,σ2)作为一组特征;利用AGGD拟合图像四个方向上的MSCN的内积,每个方向利用AGGD参数 ( η , ν , σ l 2 , σ r 2 ) (η, ν, σ_l ^2, σ_r ^2) (η,ν,σl2,σr2)作为另外四组特征。本文介绍BRISQUE采用的GGD和AGGD形状参数估计方法,并给出MATLAB、Python实现。
f
(
x
;
α
,
σ
2
)
=
α
2
β
Γ
(
1
/
α
)
exp
(
−
(
∣
x
∣
β
)
α
)
f\left(x ; \alpha, \sigma^{2}\right)=\frac{\alpha}{2 \beta \Gamma(1 / \alpha)} \exp \left(-\left(\frac{|x|}{\beta}\right)^{\alpha}\right)
f(x;α,σ2)=2βΓ(1/α)αexp(−(β∣x∣)α)
where
β
=
σ
Γ
(
1
/
α
)
Γ
(
3
/
α
)
\beta=\sigma \sqrt{\frac{\Gamma(1 / \alpha)}{\Gamma(3 / \alpha)}}
β=σΓ(3/α)Γ(1/α)
and
Γ
(
⋅
)
\Gamma(\cdot)
Γ(⋅) is the gamma function:
Γ
(
a
)
=
∫
0
∞
t
a
−
1
e
−
t
d
t
a
>
0
\Gamma(a)=\int_{0}^{\infty} t^{a-1} e^{-t} d t \quad a>0
Γ(a)=∫0∞ta−1e−tdta>0
1 零均值广义高斯分布(GGD)的参数估计
广义高斯分布定义如下:
GGD共有两个参数:参数
α
α
α控制着分布的“形状”,即衰减的速度;
σ
σ
σ控制着方差(标准差)。这两个参数的估计方法参考的是论文《Estimation of Shape Parameter for Generalized Gaussian Distributions in Subband Decompositions of Video》的方法。推导过程如下(注意里面的
γ
γ
γ即为本文的形状参数
α
α
α):
我的数学功底不强,所以我只能对照和论文理解个大概。欢迎大佬们在评论区指正!
方法的核心是下面的比函数:
ρ
(
α
)
=
σ
X
2
E
2
[
∣
X
∣
]
=
Γ
(
1
α
)
⋅
Γ
(
3
α
)
Γ
2
(
2
α
)
\rho(\alpha)=\frac{\sigma_{X}^{2}}{E^{2}[|X|]}=\frac{\Gamma\left(\frac{1}{\alpha}\right) \cdot \Gamma\left(\frac{3}{\alpha}\right)}{\Gamma^{2}\left(\frac{2}{\alpha}\right)}
ρ(α)=E2[∣X∣]σX2=Γ2(α2)Γ(α1)⋅Γ(α3)
1.首先计算均值和方差的估计值:
方差估计值即为需要估计的方差
μ
^
X
=
1
M
∑
i
=
1
11
x
i
,
σ
^
N
2
=
1
M
∑
i
=
1
M
(
x
i
−
μ
^
N
)
2
\hat{\mu}_{X}=\frac{1}{M} \sum_{i=1}^{11} x_{i}, \quad \hat{\sigma}_{N}^{2}=\frac{1}{M} \sum_{i=1}^{M}\left(x_{i}-\hat{\mu}_{N}\right)^{2}
μ^X=M1i=1∑11xi,σ^N2=M1i=1∑M(xi−μ^N)2
需要注意的是,对于零均值广义高斯分布,则
μ
^
X
=
0
\hat{\mu}_{X}=0
μ^X=0,方差估计可简化为下式:
σ
X
2
^
=
1
M
∑
i
=
1
M
x
i
2
\widehat{\sigma_{X}^{2}}=\frac{1}{M} \sum_{i=1}^{M} x_{i}^{2}
σX2
=M1i=1∑Mxi2
2.计算绝对值的修正平均值的估计值:
E
^
[
∣
X
∣
]
=
(
1
/
M
)
∑
i
=
1
M
∣
x
i
−
μ
^
X
∣
\hat{E}[|X|]=(1 / M) \sum_{i=1}^{M}\left|x_{i}-\hat{\mu}_{X}\right|
E^[∣X∣]=(1/M)i=1∑M∣xi−μ^X∣
3.设
R
^
\hat{R}
R^为
ρ
(
α
)
ρ(α)
ρ(α)的估计值,由式(4)得:
R
^
=
σ
X
2
E
2
[
∣
X
∣
]
\widehat{\mathrm{R}}=\frac{\sigma_{X}^{2}}{E^{2}[|X|]}
R
=E2[∣X∣]σX2
4.根据 (4)式等式两端相等的原则,利用查找匹配的方法确定
α
α
α。具体过程如下:
1)给出候选的
α
α
α:设定
α
α
α的查找区间,如[0.2:0.001:10]即
α
α
α在(0.2,10)区间范围每隔0.001取值。
2)将所有
α
α
α代入式(4)右边计算
ρ
(
α
)
ρ(α)
ρ(α)
3)计算所有
ρ
(
α
)
ρ(α)
ρ(α)与步骤3得出估计值
R
^
\hat{R}
R^的距离,选取距离最小对应的
α
α
α即为所求。
BRISQUE算法作者给出了零均值GGD参数估计的MATLAB代码(注意其中的 γ γ γ即为形状参数(本文的 α α α)):
function [gamparam sigma] = estimateggdparam(vec)
gam = 0.2:0.001:10;%给定候选的形状参数γ
r_gam = (gamma(1./gam).*gamma(3./gam))./((gamma(2./gam)).^2);%根据式(4)计算比值
sigma_sq = mean((vec).^2);%σ^2的零均值估计,非零均值需要计算均值然后按照(3)式
sigma = sqrt(sigma_sq);
E = mean(abs(vec));%计算步骤2
rho = sigma_sq/E^2;%计算步骤3的比值
[min_difference, array_position] = min(abs(rho - r_gam));
gamparam = gam(array_position);
我进行了对应的Python实现:
import numpy as np
from scipy.special import gamma
def estimate_GGD_parameters(vec):
gam =np.arange(0.2,10.0,0.001)#产生候选的γ
r_gam = (gamma(1/gam)*gamma(3/gam))/((gamma(2/gam))**2)#根据候选的γ计算r(γ)
sigma_sq=np.mean((vec)**2)#σ^2的零均值估计,非零均值需要计算均值然后按照(3)式
sigma=np.sqrt(sigma_sq)
E=np.mean(np.abs(vec-u_vec))
r=sigma_sq/(E**2)#根据sigma和E计算r(γ)
diff=np.abs(r-r_gam)
gamma_param=gam[np.argmin(diff, axis=0)]
return sigma,gamma_param
2 非对称广义高斯分布(AGGD)的参数估计
AGGD的定义如下:
其中:
AGGD共有三个参数,
α
、
σ
l
、
σ
r
α、σ_l、σ_r
α、σl、σr。
α
α
α控制着分布的“形状”,
σ
l
、
σ
r
σ_l、σ_r
σl、σr分别控制左右两边的扩散程度。AGGD参数的估计方法参考论文《MULTISCALE SKEWED HEAVY TAILED MODEL FOR TEXTURE ANALYSIS》的二阶估计法。推导过程如下:
我的数学功底不强,所以我只能对照和论文理解个大概。欢迎大佬们在评论区指正!
方法的核心是以下的比:
r
=
m
1
2
μ
2
=
(
γ
2
+
1
)
2
(
γ
3
+
1
)
(
γ
+
1
)
×
ρ
(
α
)
(
8
)
r=\frac{m_{1}^{2}}{\mu_{2}}=\frac{\left(\gamma^{2}+1\right)^{2}}{\left(\gamma^{3}+1\right)(\gamma+1)} \times \rho(\alpha) \ \ \ (8)
r=μ2m12=(γ3+1)(γ+1)(γ2+1)2×ρ(α) (8)
1. 首先估计
σ
σ
σ:
σ
^
l
=
1
N
l
−
1
∑
k
=
1
,
x
k
<
0
N
l
x
k
2
∣
σ
^
r
=
1
N
r
−
1
∑
k
=
1
,
x
k
≥
0
N
r
x
k
2
\begin{array}{l} \hat{\sigma}_{l}=\sqrt{\frac{1}{N_{l}-1} \sum_{k=1, x_{k}<0}^{N_{l}} x_{k}^{2} \mid} \\ \hat{\sigma}_{r}=\sqrt{\frac{1}{N_{r}-1} \sum_{k=1, x_{k} \geq 0}^{N_{r}} x_{k}^{2}} \end{array}
σ^l=Nl−11∑k=1,xk<0Nlxk2∣σ^r=Nr−11∑k=1,xk≥0Nrxk2
2. 计算
γ
γ
γ估计量:
γ
^
=
β
^
l
β
^
r
=
σ
^
l
σ
^
r
\hat{\gamma}=\frac{\hat{\beta}_{l}}{\hat{\beta}_{r}}=\frac{\hat{\sigma}_{l}}{\hat{\sigma}_{r}}
γ^=β^rβ^l=σ^rσ^l
3.计算
u
u
u的二阶估计和
m
m
m的一阶估计,
u
、
m
u、m
u、m的k阶估计如下:
μ
k
=
E
(
X
k
)
and
m
k
=
E
(
∣
X
∣
k
)
\mu_{k}=E\left(X^{k}\right) \text { and } m_{k}=E\left(|X|^{k}\right)
μk=E(Xk) and mk=E(∣X∣k)
然后根据(8)式左边估计
r
^
\hat{r}
r^:
r
^
=
m
1
2
μ
2
\hat{r}=\frac{m_{1}^{2}}{\mu_{2}}
r^=μ2m12
4. 设
R
^
\hat{R}
R^为
ρ
(
α
)
ρ(α)
ρ(α)的估计量,则根据式(8):
R
^
=
r
^
(
γ
^
3
+
1
)
(
γ
^
+
1
)
(
γ
^
2
+
1
)
2
\hat{R}=\hat{r} \frac{\left(\hat{\gamma}^{3}+1\right)(\hat{\gamma}+1)}{\left(\hat{\gamma}^{2}+1\right)^{2}}
R^=r^(γ^2+1)2(γ^3+1)(γ^+1)
5. 和GDD类似,利用查找匹配的方法确定
α
α
α。具体过程如下:
1)给出候选的
α
α
α:设定
α
α
α的查找区间,如[0.2:0.001:10]即
α
α
α在(0.2,10)区间范围每隔0.001取值。
2)将所有
α
α
α代入下式计算
ρ
(
α
)
ρ(α)
ρ(α):
ρ
(
α
)
=
Γ
(
2
/
α
)
2
Γ
(
1
/
α
)
Γ
(
3
/
α
)
\rho(\alpha)=\frac{\Gamma(2 / \alpha)^{2}}{\Gamma(1 / \alpha) \Gamma(3 / \alpha)}
ρ(α)=Γ(1/α)Γ(3/α)Γ(2/α)2
3)计算所得的 ρ ( α ) ρ(α) ρ(α)与步骤3估计的 R ^ \hat{R} R^的距离,选取距离最小对应的 α α α即为所求
BRISQUE算法作者给出了零均值AGGD参数估计的MATLAB代码(注意其中的 γ γ γ即为形状参数(本文的 α α α)):
function [alpha leftstd rightstd] = estimateaggdparam(vec)
gam = 0.2:0.001:10;%给定候选的形状参数γ
r_gam = ((gamma(2./gam)).^2)./(gamma(1./gam).*gamma(3./gam));%步骤5.3计算所有可能的ρ(α)
leftstd = sqrt(mean((vec(vec<0)).^2));%估计σ_l
rightstd = sqrt(mean((vec(vec>0)).^2));
gammahat = leftstd/rightstd;%步骤2
rhat = (mean(abs(vec)))^2/mean((vec).^2);%步骤3
rhatnorm = (rhat*(gammahat^3 +1)*(gammahat+1))/((gammahat^2 +1)^2);%步骤4
[min_difference, array_position] = min((r_gam - rhatnorm).^2);
alpha = gam(array_position);
我进行了对应了Python实现:
def estimate_AGGD_parameters(vec):
alpha =np.arange(0.2,10.0,0.001)#产生候选的α
r_alpha=((gamma(2/alpha))**2)/(gamma(1/alpha)*gamma(3/alpha))#根据候选的α计算r(α)
sigma_l=np.sqrt(np.mean(vec[vec<0]**2))#估计σ_l
sigma_r=np.sqrt(np.mean(vec[vec>0]**2))
gamma_=sigma_l/sigma_r#步骤2
#步骤3
u2=np.mean(vec**2)
m1=np.mean(np.abs(vec))
r_=m1**2/u2
R_=r_*(gamma_**3+1)*(gamma_+1)/((gamma_**2+1)**2)#步骤4
diff=(R_-r_alpha)**2
alpha_param=alpha[np.argmin(diff, axis=0)]
return sigma_l,sigma_r,alpha_param
参考文献:
[1]Mittal A , Moorthy A K , Bovik A C . No-Reference Image Quality Assessment in the Spatial Domain[J]. IEEE Transactions on Image Processing A Publication of the IEEE Signal Processing Society, 2012, 21(12):4695.
[2]Sharifi K , Leon-Garcia A . Estimation of shape parameter for generalized Gaussian distribution in subband decomposition of video[J]. IEEE Transactions on Circuits and Systems for Video Technology, 1995, 5(1):52-56.
[3]Lasmar N E , Stitou Y , Berthoumieu Y . Multiscale skewed heavy tailed model for texture analysis[C]// IEEE International Conference on Image Processing. IEEE, 2010.
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)