图像质量评价
- 无参考
- 有参考
无参考图像质量评价
1、Laplacian梯度
D
(
f
)
=
Σ
y
Σ
x
∣
G
(
x
,
y
)
∣
D(f) = \Sigma _y \Sigma_x |G(x,y)|
D(f)=ΣyΣx∣G(x,y)∣
G
(
x
,
y
)
G(x,y)
G(x,y)是点
(
x
,
y
)
(x,y)
(x,y)处Laplacian算子的卷积。
Laplacian算子,
L
=
1
6
×
[
1
4
1
4
−
20
4
1
4
1
]
L = \frac 1 6 × \begin{bmatrix} 1&4&1 \\ 4&-20&4 \\ 1&4&1\end{bmatrix}
L=61×⎣⎡1414−204141⎦⎤
# 1、Laplacian梯度
def laplacian(img):
grad = cv2.Laplacian(img, cv2.CV_64F).var()
return grad
2、Brenner梯度
D
(
f
)
=
Σ
y
Σ
x
∣
f
(
x
+
2
,
y
)
−
f
(
x
,
y
)
∣
2
D(f) = \Sigma _y \Sigma_x |f(x+2,y) - f(x,y)|^2
D(f)=ΣyΣx∣f(x+2,y)−f(x,y)∣2
# 2、Brenner梯度
def brenner(img):
h, w = img.shape
grad = 0
for i in range(w - 2):
for j in range(h):
grad += (int(img[i + 2, j]) - int(img[i, j])) ** 2
return grad
3、Tenengrad梯度
D
(
f
)
=
Σ
y
Σ
x
∣
G
(
x
,
y
)
∣
D(f) = \Sigma _y \Sigma_x |G(x,y)|
D(f)=ΣyΣx∣G(x,y)∣
G
(
x
,
y
)
G(x,y)
G(x,y)是点
(
x
,
y
)
(x,y)
(x,y)处Sobel算子水平方向和垂直方向梯度的向量。
G
(
x
,
y
)
=
G
x
2
(
x
,
y
)
+
G
y
2
(
x
,
y
)
G(x,y) = \sqrt {G_x^2 (x,y) + G_y^2 (x,y)}
G(x,y)=Gx2(x,y)+Gy2(x,y)
G
x
(
x
,
y
)
G_x(x,y)
Gx(x,y)和
G
y
(
x
,
y
)
G_y(x,y)
Gy(x,y)是点
(
x
,
y
)
(x,y)
(x,y)处Sobel算子水平方向和垂直方向梯度。
# 3、Tenengrad梯度
def tenengrad(img):
h, w = img.shape
grad = 0
for i in range(w):
for j in range(h):
gradX = cv2.Sobel(img, cv2.CV_64F, 1, 0)
gradY = cv2.Sobel(img, cv2.CV_64F, 0, 1)
grad += np.sqrt(gradX ** 2 + gradY ** 2)
return grad
4、Energy梯度
D
(
f
)
=
Σ
y
Σ
x
(
∣
f
(
x
+
1
,
y
)
−
f
(
x
,
y
)
∣
2
+
∣
f
(
x
,
y
+
1
)
−
f
(
x
,
y
)
∣
2
)
D(f) = \Sigma _y \Sigma_x ( |f(x+1,y) - f(x,y)|^2 + |f(x,y+1) - f(x,y)|^2 )
D(f)=ΣyΣx(∣f(x+1,y)−f(x,y)∣2+∣f(x,y+1)−f(x,y)∣2)
# 4、Energy梯度
def energy(img):
h, w = img.shape
grad = 0
for i in range(w):
for j in range(h):
gradX = (int(img[i + 1, j]) - int(img[i, j])) ** 2
gradY = (int(img[i, j + 1]) - int(img[i, j])) ** 2
grad += (gradX + gradY)
return grad
5、Roberts梯度
D
(
f
)
=
Σ
y
Σ
x
(
∣
f
(
x
+
1
,
y
+
1
)
−
f
(
x
,
y
)
∣
2
+
∣
f
(
x
+
1
,
y
)
−
f
(
x
,
y
+
1
)
∣
2
)
D(f) = \Sigma _y \Sigma_x ( |f(x+1,y+1) - f(x,y)|^2 + |f(x+1,y) - f(x,y+1)|^2 )
D(f)=ΣyΣx(∣f(x+1,y+1)−f(x,y)∣2+∣f(x+1,y)−f(x,y+1)∣2)
# 5、Roberts梯度
def roberts(img):
h, w = img.shape
grad = 0
for i in range(w):
for j in range(h):
gradX = (int(img[i + 1, j + 1]) - int(img[i, j])) ** 2
gradY = (int(img[i + 1, j]) - int(img[i, j + 1])) ** 2
grad += (gradX + gradY)
return grad
6、SMD
D
(
f
)
=
Σ
y
Σ
x
(
∣
f
(
x
,
y
)
−
f
(
x
,
y
−
1
)
∣
+
∣
f
(
x
,
y
)
−
f
(
x
+
1
,
y
)
∣
)
D(f) = \Sigma _y \Sigma_x ( |f(x,y) - f(x,y-1)| + |f(x,y) - f(x+1,y)| )
D(f)=ΣyΣx(∣f(x,y)−f(x,y−1)∣+∣f(x,y)−f(x+1,y)∣)
# 6、SMD函数
def SMD(img):
h, w = img.shape
grad = 0
for i in range(w - 1):
for j in range(1, h):
gradX = abs(int(img[i, j]) - int(img[i + 1, j]))
gradY = abs(int(img[i, j]) - int(img[i, j - 1]))
grad += (gradX + gradY)
return grad
7、SMD2
D
(
f
)
=
Σ
y
Σ
x
(
∣
f
(
x
,
y
)
−
f
(
x
+
1
,
y
)
∣
∗
∣
f
(
x
,
y
)
−
f
(
x
,
y
+
1
)
∣
)
D(f) = \Sigma _y \Sigma_x ( |f(x,y) - f(x+1,y)|* |f(x,y) - f(x,y+1)| )
D(f)=ΣyΣx(∣f(x,y)−f(x+1,y)∣∗∣f(x,y)−f(x,y+1)∣)
# 7、SMD2函数
def SMD2(img):
h, w = img.shape
grad = 0
for i in range(w - 1):
for j in range(h - 1):
gradX = abs(int(img[i, j]) - int(img[i + 1, j]))
gradY = abs(int(img[i, j]) - int(img[i, j + 1]))
grad += (gradX * gradY)
return grad
8、方差
D
(
f
)
=
Σ
y
Σ
x
∣
f
(
x
,
y
)
−
μ
∣
2
D(f) = \Sigma _y \Sigma_x |f(x,y) - \mu|^2
D(f)=ΣyΣx∣f(x,y)−μ∣2
μ
\mu
μ是整个图像像素值的均值。
# 8、方差函数
def variance(img):
h, w = img.shape
m = np.mean(img)
grad = 0
for i in range(w):
for j in range(h):
grad += (img[i, j] - m) ** 2
return grad
# 这种方法也可以,速度更快
np.var(img)
9、Vollath自相关
D
(
f
)
=
Σ
y
Σ
x
(
f
(
x
,
y
)
∗
f
(
x
+
1
,
y
)
−
H
∗
W
∗
μ
2
)
D(f) = \Sigma _y \Sigma_x ( f(x,y) * f(x+1,y) - H*W* \mu ^2)
D(f)=ΣyΣx(f(x,y)∗f(x+1,y)−H∗W∗μ2)
H
H
H、
W
W
W分别是图像的高和宽。
# 9、Vollath自相关函数
def vollath(img):
h, w = img.shape
m = np.mean(img)
gradMean = (w + 1) * h * m ** 2
grad = 0
for i in range(w - 1):
for j in range(h):
grad += img[i, j] * img[i + 1, j]
return grad - gradMean
10、熵
D
(
f
)
=
−
∑
i
=
0
L
−
1
p
i
∗
l
o
g
2
(
p
i
)
D(f) = - \sum ^{L-1}_{i=0} p_i *log_2(p_i)
D(f)=−i=0∑L−1pi∗log2(pi)
L
=
256
L=256
L=256,表示图像的像素值,
p
i
p_i
pi是图像像素值
i
i
i出现的概率。
# 10、熵函数
def entropy(img):
h, w = img.shape
grad = 0
p = np.bincount(np.array(img).flatten()) # img中每个像素值出现的次数
for i in range(len(p)):
if p[i] > 0:
pi = (p[i] / (w * h))
grad -= pi * np.log2(pi)
return grad