图像质量评估

article/2025/11/11 15:24:32

拍照容易,但拍出高质量的照片却很难。它需要良好的构图和照明。合适的镜头和卓越的设备可以产生很大的不同。但最重要的是,高质量的照片需要良好的品味和判断力。你需要专家的眼光。

但是,是否有一种数学质量度量可以捕捉这种人类判断?

答案是肯定的和否定的!

有一些质量度量很容易被算法捕获。例如,我们可以查看像素捕获的信息并将图像标记为嘈杂或模糊。

另一方面,算法几乎不可能捕获某些质量度量。例如,算法很难评估需要文化背景的图片的质量。

1.什么是图像质量评估(IQA)?

图像质量评估(IQA)算法以任意图像作为输入,输出质量分数作为输出。IQA有三种类型:

  • Full-Reference IQA:在这里,您有一个“干净”的参考(未失真)图像来测量失真图像的质量。该度量可用于评估图像压缩算法的质量,其中我们可以访问原始图像及其压缩版本图像。
  • Reduced-Reference IQA:在这里,您没有参考图像,而是具有一些关于它的选择性信息的图像(例如水印图像),以比较和测量失真图像的质量。
  • Objective Blind or No-Reference IQA:算法获得的唯一输入是您要测量其质量的图像。

2.传统图像质量评价指标:PSNR,SSIM,IEF,UQI

记噪声图为 X X X,滤波后的图像为 F F F,标准图像为 O O O M , N M,N M,N为图像的两个维度的大小。

2.1 Peak Signal to Noise Ratio (PSNR)峰值信噪比

如果图像是8位灰度图像,则: P S N R = 10 l o g ( 25 5 2 M S E ) PSNR = 10log(\frac{255^2}{MSE}) PSNR=10log(MSE2552)
其中: M S E MSE MSE为均方差误差:
M S E = 1 M ∗ N ∑ i = 0 M − 1 ∑ j = 0 N − 1 [ O ( i , j ) − F ( i , j ) ] 2 MSE=\frac{1}{M*N}\sum^{M-1}_{i=0}\sum^{N-1}_{j=0}{[O(i,j)-F(i,j)]^2} MSE=MN1i=0M1j=0N1[O(i,j)F(i,j)]2

PSNR值越大,图像质量越高。

2.2 Structural Similarity Index Metric(SSIM)结构相似性

S S I M ( O , F ) = ( 2 μ O μ F + c 1 ) ( 2 σ O F + c 2 ) ( μ O 2 + μ F 2 + c 1 ) ( μ O 2 + μ F 2 + c 2 ) SSIM(O,F)=\frac{(2\mu_O\mu_F+c_1)(2\sigma_{OF}+c2)}{(\mu^2_O+\mu^2_F+c_1)(\mu^2_O+\mu^2_F+c_2)} SSIM(O,F)=(μO2+μF2+c1)(μO2+μF2+c2)(2μOμF+c1)(2σOF+c2)
其中, μ O , μ F , σ O 2 , σ F 2 和 σ O F 分 别 是 图 像 O 和 F 的 平 均 强 度 、 标 准 差 和 协 方 差 。 \mu_O,\mu_F,\sigma^2_O,\sigma^2_F和\sigma_{OF}分别是图像O和F的平均强度、标准差和协方差。 μO,μF,σO2,σF2σOFOF
μ O = 1 M ∗ N ∑ i = 0 M − 1 ∑ j = 0 N − 1 O ( i , j ) μ F = 1 M ∗ N ∑ i = 0 M − 1 ∑ j = 0 N − 1 F ( i , j ) σ F = ( 1 M ∗ N − 1 ∑ i = 0 M − 1 ∑ j = 0 N − 1 [ F ( i , j ) − μ F ] 2 ) 1 2 σ O = ( 1 M ∗ N − 1 ∑ i = 0 M − 1 ∑ j = 0 N − 1 [ O ( i , j ) − μ O ] 2 ) 1 2 σ O F = ( 1 M ∗ N − 1 ∑ i = 0 M − 1 ∑ j = 0 N − 1 [ O ( i , j ) − μ O ] [ F ( i , j ) − μ F ] ) 1 2 \mu_O=\frac{1}{M*N}\sum^{M-1}_{i=0}\sum^{N-1}_{j=0}{O(i,j)}\\ \mu_F=\frac{1}{M*N}\sum^{M-1}_{i=0}\sum^{N-1}_{j=0}{F(i,j)}\\ \sigma_F=(\frac{1}{M*N-1}\sum^{M-1}_{i=0}\sum^{N-1}_{j=0}{[F(i,j)-\mu_F]^2})^{\frac{1}{2}}\\ \sigma_O=(\frac{1}{M*N-1}\sum^{M-1}_{i=0}\sum^{N-1}_{j=0}{[O(i,j)-\mu_O]^2})^{\frac{1}{2}}\\ \sigma_{OF}=(\frac{1}{M*N-1}\sum^{M-1}_{i=0}\sum^{N-1}_{j=0}{[O(i,j)-\mu_O][F(i,j)-\mu_F]})^{\frac{1}{2}} μO=MN1i=0M1j=0N1O(i,j)μF=MN1i=0M1j=0N1F(i,j)σF=(MN11i=0M1j=0N1[F(i,j)μF]2)21σO=(MN11i=0M1j=0N1[O(i,j)μO]2)21σOF=(MN11i=0M1j=0N1[O(i,j)μO][F(i,j)μF])21
c 1 = ( K 1 L ) 2 , c 2 = ( K 2 L ) 2 c_1=(K_1L)^2, c_2=(K_2L)^2 c1=(K1L)2,c2=(K2L)2,对于8位灰度的图像 L = 255 L=255 L=255,常数 k 1 = 0.01 , k 2 = 0.03 k_1=0.01,k2=0.03 k1=0.01,k2=0.03
SSIM值越大,图像质量越好

2.3 Image Enhancement Factor (IEF)图像增强因子

I E F = ∑ i = 0 M − 1 ∑ j = 0 N − 1 [ X ( i , j ) − μ O ] 2 ∑ i = 0 M − 1 ∑ j = 0 N − 1 [ F ( i , j ) − μ O ] 2 IEF=\frac{\sum^{M-1}_{i=0}\sum^{N-1}_{j=0}{[X(i,j)-\mu_O]^2}}{\sum^{M-1}_{i=0}\sum^{N-1}_{j=0}{[F(i,j)-\mu_O]^2}} IEF=i=0M1j=0N1[F(i,j)μO]2i=0M1j=0N1[X(i,j)μO]2
IEF值越大,图像质量越好

2.4 Universal Quality Index (UQI)通用质量指标

U Q I = 4 μ O μ F σ O F ( μ O 2 + μ F 2 ) ( σ O 2 + σ F 2 ) UQI=\frac{4\mu_O\mu_F\sigma_{OF}}{(\mu^2_O+\mu^2_F)(\sigma^2_O+\sigma^2_F)} UQI=(μO2+μF2)(σO2+σF2)4μOμFσOF
UQI值越大,图像质量越好

2.5代码实现

import numpy as npclass ImageEvalue(object):def image_mean(self, image):mean = np.mean(image)return meandef image_var(self, image, mean):m, n = np.shape(image)var = np.sqrt(np.sum((image - mean) ** 2) / (m * n - 1))return vardef images_cov(self, image1, image2, mean1, mean2):m, n = np.shape(image1)cov = np.sum((image1 - mean1) * (image2 - mean2)) / (m * n - 1)return covdef PSNR(self, O, F):''':param O: 原始图像:param F: 滤波后的图像'''MES = np.mean((np.array(O) - np.array(F)) ** 2)PSNR = 10 * np.log10(255 ** 2 / MES)return PSNRdef SSIM(self, O, F):''':param O: 原始图像:param F: 滤波后的图像'''c1 = (0.01 * 255) ** 2c2 = (0.03 * 255) ** 2meanO = self.image_mean(O)meanF = self.image_mean(F)varO = self.image_var(O, meanO)varF = self.image_var(O, meanF)covOF = self.images_cov(O, F, meanO, meanF)SSIM = (2 * meanO * meanF + c1) * (2 * covOF + c2) / ((meanO ** 2 + meanF ** 2 + c1) * (varO ** 2 + varF ** 2 + c2))return SSIMdef IEF(self, O, F, X):''':param O: 原始图像:param F: 滤波后的图像:param X: 噪声图像'''IEF = np.sum((X - O) ** 2) / np.sum((F - O) ** 2)return IEFdef UQI(self, O, F):''':param O: 原始图像:param F: 滤波后的图像'''meanO = self.image_mean(O)meanF = self.image_mean(F)varO = self.image_var(O, meanO)varF = self.image_var(F, meanF)covOF = self.images_cov(O, F, meanO, meanF)UQI = 4 * meanO * meanF * covOF / ((meanO ** 2 + meanF ** 2) * (varO ** 2 + varF ** 2))return UQI
if __name__ == '__main__':import cv2objectPath = "monalisa.jpg"filteredPath = "monalisa_noisy.jpg"obj = cv2.imread(objectPath)fil = cv2.imread(filteredPath)imageEva = ImageEvalue()print("PSNR: ", imageEva.PSNR(obj, fil))print("SSIM: ", imageEva.SSIM(obj, fil))print("IEF: ", imageEva.IEF(obj, fil, fil))print("UQI: ", imageEva.UQI(obj, fil))# PSNR:  28.85540647761987# SSIM:  0.9514112121745085# IEF:  1.0# UQI:  0.929498884845049

2.6代码实现所用图像

monalisa.jpgmonalisa_noisy.jpg

3.Deep CNN-Based Blind Image Quality Predictor (DIQA)基于深度 CNN 的图像质量评估

3.1什么是DIQA?

DIQA将深度学习应用于图像质量评估(IQA)的一些最令人担忧的挑战。相对于其他方法的优势是:

  • 该模型并不仅限于使用自然场景统计(NSS)图像
  • 通过将训练分为两个阶段(1)特征学习和(2)将学习到的特征映射到主观分数来防止过拟合。

3.2 问题

为IQA生成数据集的成本很高,因为它需要专家监督。因此,基本的IQA基准仅仅由几千条数据组成。后者使深度学习模型的创建变得复杂,因为它们需要大量的训练样本来进行泛化。

例如,让我们考虑最常用的用于训练和评估IQA方法的数据集Live, TID2008, TID2013, CSIQ。下表中包含了每个数据集的总体总结:
在这里插入图片描述
样本总数不超过 4,000 条记录。

3.3 代码实现

具体实现连接如下:https://towardsdatascience.com/deep-image-quality-assessment-with-tensorflow-2-0-69ed8c32f195

# 分数越低图像质量越好,反之亦然
# pip install image-quality
import imquality.brisque as brisque
import PIL.Image
import matplotlib.pyplot as plt
path1 = '1.jpg'
path2 = '2.jpg'# 读取图片
img1 = PIL.Image.open(path1)
plt.imshow(img1)
plt.axis('off')
# 对以上图像质量评估
print("image-quality  {}".format(brisque.score(img1)))# 读取图片
img2 = PIL.Image.open(path2)
plt.imshow(img2)
plt.axis('off')
# 对以上图像质量评估
print("image-quality  {}".format(brisque.score(img2)))

3.4 图像

在这里插入图片描述在这里插入图片描述

4.Blind/referenceless image spatial quality evaluator (BRISQUE)

在本节中,我们将基于python逐步实现 BRISQUE 方法。

BRISQUE是一种仅使用图像像素来计算特征的模型(其他方法是基于图像到其他空间的变换,如小波或 DCT)。它被证明是高效的,因为它不需要任何转换来计算其特征。 BRISQUE 依赖于空间域中局部归一化亮度系数的空间自然场景统计 (NSS) 模型,以及这些系数的两两乘积之和模型。

链接:https://pan.baidu.com/s/1gB2buLZKioYoPw3LXLAuHg 
提取码:123a

4.1 代码展示

#!/usr/bin/python3
# -*- encoding: utf-8 -*-
import collections
from itertools import chain
import urllib.request as request
import pickleimport numpy as npimport scipy.signal as signal
import scipy.special as special
import scipy.optimize as optimizeimport matplotlib.pyplot as pltimport skimage.io
import skimage.transformimport cv2from libsvm import svmutil# 空间域的自然场景统计(NSS)# # 作者得到局部均值的方式可能有点令人困惑,它只是对图像应用了高斯滤波器。
def normalize_kernel(kernel):return kernel / np.sum(kernel)
def gaussian_kernel2d(n, sigma):Y, X = np.indices((n, n)) - int(n / 2)gaussian_kernel = 1 / (2 * np.pi * sigma ** 2) * np.exp(-(X ** 2 + Y ** 2) / (2 * sigma ** 2))return normalize_kernel(gaussian_kernel)
def local_mean(image, kernel):return signal.convolve2d(image, kernel, 'same')# 然后计算局部偏差
def local_deviation(image, local_mean, kernel):"Vectorized approximation of local deviation"sigma = image ** 2sigma = signal.convolve2d(sigma, kernel, 'same')return np.sqrt(np.abs(local_mean ** 2 - sigma))# 最后,我们计算了MSCN系数
def calculate_mscn_coefficients(image, kernel_size=6, sigma=7 / 6):C = 1 / 255kernel = gaussian_kernel2d(kernel_size, sigma=sigma)local_mean = signal.convolve2d(image, kernel, 'same')local_var = local_deviation(image, local_mean, kernel)return (image - local_mean) / (local_var + C)# 作者发现,在更广泛的失真图像中,MSCN系数呈广义高斯分布。
def generalized_gaussian_dist(x, alpha, sigma):beta = sigma * np.sqrt(special.gamma(1 / alpha) / special.gamma(3 / alpha))coefficient = alpha / (2 * beta() * special.gamma(1 / alpha))return coefficient * np.exp(-(np.abs(x) / beta) ** alpha)# 相邻 MSCN 系数两两相乘
def calculate_pair_product_coefficients(mscn_coefficients):return collections.OrderedDict({'mscn': mscn_coefficients,'horizontal': mscn_coefficients[:, :-1] * mscn_coefficients[:, 1:],'vertical': mscn_coefficients[:-1, :] * mscn_coefficients[1:, :],'main_diagonal': mscn_coefficients[:-1, :-1] * mscn_coefficients[1:, 1:],'secondary_diagonal': mscn_coefficients[1:, :-1] * mscn_coefficients[:-1, 1:]})# 作者提到广义高斯分布不能很好地拟合系数乘积的经验直方图。因此,他们提出了非对称广义高斯分布 (AGGD) 模型
def asymmetric_generalized_gaussian(x, nu, sigma_l, sigma_r):def beta(sigma):return sigma * np.sqrt(special.gamma(1 / nu) / special.gamma(3 / nu))coefficient = nu / ((beta(sigma_l) + beta(sigma_r)) * special.gamma(1 / nu))f = lambda x, sigma: coefficient * np.exp(-(x / beta(sigma)) ** nu)return np.where(x < 0, f(-x, sigma_l), f(x, sigma_r))# 非对称广义高斯分布的拟合方法
def asymmetric_generalized_gaussian_fit(x):def estimate_phi(alpha):numerator = special.gamma(2 / alpha) ** 2denominator = special.gamma(1 / alpha) * special.gamma(3 / alpha)return numerator / denominatordef estimate_r_hat(x):size = np.prod(x.shape)return (np.sum(np.abs(x)) / size) ** 2 / (np.sum(x ** 2) / size)def estimate_R_hat(r_hat, gamma):numerator = (gamma ** 3 + 1) * (gamma + 1)denominator = (gamma ** 2 + 1) ** 2return r_hat * numerator / denominatordef mean_squares_sum(x, filter=lambda z: z == z):filtered_values = x[filter(x)]squares_sum = np.sum(filtered_values ** 2)return squares_sum / ((filtered_values.shape))def estimate_gamma(x):left_squares = mean_squares_sum(x, lambda z: z < 0)right_squares = mean_squares_sum(x, lambda z: z >= 0)return np.sqrt(left_squares) / np.sqrt(right_squares)def estimate_alpha(x):r_hat = estimate_r_hat(x)gamma = estimate_gamma(x)R_hat = estimate_R_hat(r_hat, gamma)solution = optimize.root(lambda z: estimate_phi(z) - R_hat, [0.2]).xreturn solution[0]def estimate_sigma(x, alpha, filter=lambda z: z < 0):return np.sqrt(mean_squares_sum(x, filter))def estimate_mean(alpha, sigma_l, sigma_r):return (sigma_r - sigma_l) * constant * (special.gamma(2 / alpha) / special.gamma(1 / alpha))alpha = estimate_alpha(x)sigma_l = estimate_sigma(x, alpha, lambda z: z < 0)sigma_r = estimate_sigma(x, alpha, lambda z: z >= 0)constant = np.sqrt(special.gamma(1 / alpha) / special.gamma(3 / alpha))mean = estimate_mean(alpha, sigma_l, sigma_r)return alpha, mean, sigma_l, sigma_r# 计算BRISQUE特征
def calculate_brisque_features(image, kernel_size=7, sigma=7 / 6):def calculate_features(coefficients_name, coefficients, accum=np.array([])):alpha, mean, sigma_l, sigma_r = asymmetric_generalized_gaussian_fit(coefficients)if coefficients_name == 'mscn':var = (sigma_l ** 2 + sigma_r ** 2) / 2return [alpha, var]return [alpha, mean, sigma_l ** 2, sigma_r ** 2]mscn_coefficients = calculate_mscn_coefficients(image, kernel_size, sigma)coefficients = calculate_pair_product_coefficients(mscn_coefficients)features = [calculate_features(name, coeff) for name, coeff in coefficients.items()]flatten_features = list(chain.from_iterable(features))return np.array(flatten_features)# 辅助函数
def load_image(url):image_stream = request.urlopen(url)return skimage.io.imread(image_stream, plugin='pil')def plot_histogram(x, label):n, bins = np.histogram(x.ravel(), bins=50)n = n / np.max(n)plt.plot(bins[:-1], n, label=label, marker='o')# 在创建计算brisque特征所需的所有函数后,我们可以估计给定图像的图像质量。他们使用来自柯达数据集的图像。# 1.加载图像
plt.rcParams["figure.figsize"] = 12, 9url = 'http://www.cs.albany.edu/~xypan/research/img/Kodak/kodim05.png'
image = load_image(url)
gray_image = skimage.color.rgb2gray(image)_ = skimage.io.imshow(image)# 2.计算系数
mscn_coefficients = calculate_mscn_coefficients(gray_image, 7, 7 / 6)
coefficients = calculate_pair_product_coefficients(mscn_coefficients)plt.rcParams["figure.figsize"] = 12, 11for name, coeff in coefficients.items():plot_histogram(coeff.ravel(), name)
# 在计算 MSCN 系数和两两相乘后,我们可以验证分布实际上是不同的。
plt.axis([-2.5, 2.5, 0, 1.05])
plt.legend()
plt.show()# 3. 广义高斯分布的拟合系数
brisque_features = calculate_brisque_features(gray_image, kernel_size=7, sigma=7 / 6)# 4.调整图像大小并计算 BRISQUE 特征
downscaled_image = cv2.resize(gray_image, None, fx=1 / 2, fy=1 / 2, interpolation=cv2.INTER_CUBIC)
downscale_brisque_features = calculate_brisque_features(downscaled_image, kernel_size=7, sigma=7 / 6)brisque_features = np.concatenate((brisque_features, downscale_brisque_features))# 5. 缩放特征并送给 SVR
# 作者提供了一个预训练的 SVR 模型来计算质量评估。然而,
# 为了得到好的结果,我们需要将特征缩放到[- 1,1]。对于后者,我们需要作者用来缩放特征向量的相同参数。
def scale_features(features):with open('normalize.pickle', 'rb') as handle:scale_params = pickle.load(handle)min_ = np.array(scale_params['min_'])max_ = np.array(scale_params['max_'])return -1 + (2.0 / (max_ - min_) * (features - min_))def calculate_image_quality_score(brisque_features):model = svmutil.svm_load_model('brisque_svm.txt')scaled_brisque_features = scale_features(brisque_features)x, idx = svmutil.gen_svm_nodearray(scaled_brisque_features,isKernel=(model.param.kernel_type == svmutil.PRECOMPUTED))nr_classifier = 1prob_estimates = (svmutil.c_double * nr_classifier)()return svmutil.libsvm.svm_predict_probability(model, x, prob_estimates)# 用于表示图像质量的比例从0到100。图像质量为100表示图像的质量很差。
# 在分析图像的情况下,我们得到它是一个高质量的图像。这是有道理的,因为我们使用的是参考图像。
print(calculate_image_quality_score(brisque_features))
# 4.954157281562374

4.1 空间域的自然场景统计(NSS)

给定一幅图像,我们通过原像素减去局部均值然后除以局部偏差,添加一个常数以避免零除法来获得局部归一化的图像。
在这里插入图片描述
如 果 I ( i , j ) 域 是 [ 0 , 255 ] 那 么 C = 1 如 果 域 是 [ 0 , 1 ] 那 么 C = 1 / 255 如果 I(i, j) 域是 [0, 255] 那么 C=1 如果域是 [0, 1] 那么 C=1/255 I(i,j)[0,255]C=1[0,1]C=1/255

要计算局部归一化的图像,也称为MSCN系数,我们必须计算局部平均值。这里,w 是大小为 (K, L) 的高斯核。
在这里插入图片描述
作者取得局部均值的方式可能有点令人困惑,它是通过对图像应用高斯滤波器来计算的。

def normalize_kernel(kernel):return kernel / np.sum(kernel)def gaussian_kernel2d(n, sigma):Y, X = np.indices((n, n)) - int(n/2)gaussian_kernel = 1 / (2 * np.pi * sigma ** 2) * np.exp(-(X ** 2 + Y ** 2) / (2 * sigma ** 2)) return normalize_kernel(gaussian_kernel)def local_mean(image, kernel):return signal.convolve2d(image, kernel, 'same')

然后计算局部偏差:
在这里插入图片描述


def local_deviation(image, local_mean, kernel):"Vectorized approximation of local deviation"sigma = image ** 2sigma = signal.convolve2d(sigma, kernel, 'same')return np.sqrt(np.abs(local_mean ** 2 - sigma))

最后,我们计算 MSCN 系数。
在这里插入图片描述

def calculate_mscn_coefficients(image, kernel_size=6, sigma=7/6):C = 1/255kernel = gaussian_kernel2d(kernel_size, sigma=sigma)local_mean = signal.convolve2d(image, kernel, 'same')local_var = local_deviation(image, local_mean, kernel)return (image - local_mean) / (local_var + C)

作者发现 MSCN 系数服从广义高斯分布 (GGD) ,适用于更广泛的失真图像。 GGD 密度函数为:
在这里插入图片描述
其中,
在这里插入图片描述
Г 是 伽 马 函 数 。 参 数 α 控 制 形 状 , σ ² 控 制 方 差 。 Г 是伽马函数。参数 α 控制形状,σ² 控制方差。 Гασ²

def generalized_gaussian_dist(x, alpha, sigma):beta = sigma * np.sqrt(special.gamma(1 / alpha) / special.gamma(3 / alpha))coefficient = alpha / (2 * beta() * special.gamma(1 / alpha))return coefficient * np.exp(-(np.abs(x) / beta) ** alpha)

4.2 相邻 MSCN 系数的两两相乘

相邻系数的符号也表现出规则结构,在存在失真时会受到干扰。作者提出了沿四个方向(1)水平H,(2)垂直V,(3)主对角线D1和(4)次对角线D2的相邻MSCN系数的两两相乘模型。
在这里插入图片描述

def calculate_pair_product_coefficients(mscn_coefficients):return collections.OrderedDict({'mscn': mscn_coefficients,'horizontal': mscn_coefficients[:, :-1] * mscn_coefficients[:, 1:],'vertical': mscn_coefficients[:-1, :] * mscn_coefficients[1:, :],'main_diagonal': mscn_coefficients[:-1, :-1] * mscn_coefficients[1:, 1:],'secondary_diagonal': mscn_coefficients[1:, :-1] * mscn_coefficients[:-1, 1:]})

此外,他提到 GGD 不能很好地拟合系数乘积的经验直方图。因此,他们建议拟合非对称广义高斯分布 (AGGD) 模型,而不是将这些系数拟合到 GGD。 AGGD 密度函数为:
在这里插入图片描述
其中,
在这里插入图片描述
s i d e 可 以 是 r 或 l 。 side 可以是 r 或 l。 siderl前面公式中没有体现的另一个参数是均值:
在这里插入图片描述

def asymmetric_generalized_gaussian(x, nu, sigma_l, sigma_r):def beta(sigma):return sigma * np.sqrt(special.gamma(1 / nu) / special.gamma(3 / nu))coefficient = nu / ((beta(sigma_l) + beta(sigma_r)) * special.gamma(1 / nu))f = lambda x, sigma: coefficient * np.exp(-(x / beta(sigma)) ** nu)return np.where(x < 0, f(-x, sigma_l), f(x, sigma_r))

4.3 拟合非对称广义高斯分布

算法步骤为:

  • 1.计算 γ,其中 Nₗ 是负样本的数量,Nᵣ 是正样本的数量。
    在这里插入图片描述

  • 2.计算 r ^ \hat{r} r^
    在这里插入图片描述

  • 3.使用 γ 和 r ^ 估 计 计 算 R ^ γ 和 \hat{r}估计计算 \hat{R} γr^R^
    在这里插入图片描述

  • 4.使用逆广义高斯比的近似值估计 α \alpha α
    在这里插入图片描述

  • 5.估计左右尺度参数。
    在这里插入图片描述

    def estimate_phi(alpha):numerator = special.gamma(2 / alpha) ** 2denominator = special.gamma(1 / alpha) * special.gamma(3 / alpha)return numerator / denominatordef estimate_r_hat(x):size = np.prod(x.shape)return (np.sum(np.abs(x)) / size) ** 2 / (np.sum(x ** 2) / size)def estimate_R_hat(r_hat, gamma):numerator = (gamma ** 3 + 1) * (gamma + 1)denominator = (gamma ** 2 + 1) ** 2return r_hat * numerator / denominatordef mean_squares_sum(x, filter = lambda z: z == z):filtered_values = x[filter(x)]squares_sum = np.sum(filtered_values ** 2)return squares_sum / ((filtered_values.shape))def estimate_gamma(x):left_squares = mean_squares_sum(x, lambda z: z < 0)right_squares = mean_squares_sum(x, lambda z: z >= 0)return np.sqrt(left_squares) / np.sqrt(right_squares)def estimate_alpha(x):r_hat = estimate_r_hat(x)gamma = estimate_gamma(x)R_hat = estimate_R_hat(r_hat, gamma)solution = optimize.root(lambda z: estimate_phi(z) - R_hat, [0.2]).xreturn solution[0]def estimate_sigma(x, alpha, filter = lambda z: z < 0):return np.sqrt(mean_squares_sum(x, filter))def estimate_mean(alpha, sigma_l, sigma_r):return (sigma_r - sigma_l) * constant * (special.gamma(2 / alpha) / special.gamma(1 / alpha))alpha = estimate_alpha(x)sigma_l = estimate_sigma(x, alpha, lambda z: z < 0)sigma_r = estimate_sigma(x, alpha, lambda z: z >= 0)constant = np.sqrt(special.gamma(1 / alpha) / special.gamma(3 / alpha))mean = estimate_mean(alpha, sigma_l, sigma_r)return alpha, mean, sigma_l, sigma_r

4.4 计算 BRISQUE 特征

计算图像质量所需的特征是将MSCN系数和移位乘积拟合到广义高斯分布的结果。首先,我们需要将MSCN系数拟合到GDD上,然后将两两乘积拟合到AGGD上。以下是对这些特性的总结:
在这里插入图片描述

def calculate_brisque_features(image, kernel_size=7, sigma=7/6):def calculate_features(coefficients_name, coefficients, accum=np.array([])):alpha, mean, sigma_l, sigma_r = asymmetric_generalized_gaussian_fit(coefficients)if coefficients_name == 'mscn':var = (sigma_l ** 2 + sigma_r ** 2) / 2return [alpha, var]return [alpha, mean, sigma_l ** 2, sigma_r ** 2]mscn_coefficients = calculate_mscn_coefficients(image, kernel_size, sigma)coefficients = calculate_pair_product_coefficients(mscn_coefficients)features = [calculate_features(name, coeff) for name, coeff in coefficients.items()]flatten_features = list(chain.from_iterable(features))return np.array(flatten_features)

4.5 结果

在这里插入图片描述
在这里插入图片描述

参考目录

https://towardsdatascience.com/automatic-image-quality-assessment-in-python-391a6be52c11
https://github.com/ocampor/image-quality
https://mp.weixin.qq.com/s/O9t4lTSHjSi044X1ZX0nhQ


http://chatgpt.dhexx.cn/article/PPXLcMcp.shtml

相关文章

图像质量评价(Image Quality Assessment,IQA)

这篇blog是我记录自己开始做科研的一些笔记、多是从论文和各种博客的集合&#xff0c;偶有一些自己的思考和想法。由于网上相关图像质量评估的整理资料相对较少&#xff0c;如果能帮到看到这篇文章的你&#xff0c;那真是非常棒&#xff01;会持续更新补全一些东西&#xff0c;…

jdk卸载不干净解决办法

Win7系统下安装jdk报错&#xff1b;错误信息&#xff1a;“ Windows Installer 程序包有问题。此安装需要的DLL不能运行。请与您的支持人员或程序包开发商联系”。 造成该问题的原因是系统以前安装过jdk&#xff0c;重新安装需要彻底卸载旧的jdk&#xff0c;这样重新安装才能成…

JDK1.8下载安装与卸载删除

文章目录 一、彻底卸载删除jdk二、oracle账号密码三、JDK1.8下载安装&#xff08;1&#xff09;官网下载&#xff08;2&#xff09;选择JDK&#xff08;3&#xff09;点击同意协议&#xff08;4&#xff09;登录或者注册后登录Oracle账户&#xff08;5&#xff09;保存到本地&a…

如何正确(完美)卸载Java/JDK/JRE

ps:发现网上很多人再重新安装jdk和卸载时有问题,下面这种方法我不敢保证100%有效,但可以尝试,因为我这种情况是有效的.下面是转载内容希望可以多大家提供一点帮助. 官网卸载 角度看工具 https://www.java.com/zh_CN/download/uninstalltool.jsp 很多人在删除JDK时&#xff0c…

(转载)如何将jdk完全卸载

如何将jdk完全卸载 在从eclipse转向idea写java程序的时候遇到了一些关于jdk的问题&#xff0c;可能是第一次安装的时候留下的后遗症&#xff0c;所以就把jdk卸载了重新安装一次&#xff0c;在CSDN上搜到了楼主的帖子&#xff0c;亲测有效&#xff0c;所以转载分享一下&#xf…

微信小程序实现标签栏

标签栏实现功能&#xff1a; 页面向下滑动&#xff0c;标签栏吸顶。点击标签项&#xff0c;标签项呈现选中态&#xff0c;并切换到对应的面板。在面板中进行滑动&#xff0c;可切换标签项和面板。 <!-- tabs.wxml --> <wxs module"touch" src"./tou…

微信小程序富文本标签rich-text

前言&#xff1a; 做项目过程中&#xff0c;经常遇到需要在小程序中展示用富文本编辑器生成的内容。包含着各种HTML标签和样式。这就需要用到rich-text组件。 具体用法&#xff1a; 1、index.wxml文件&#xff1a; // nodes属性接收富文本内容&#xff0c;可以是字符串&…

微信小程序开发之——音乐播放器-实现标签页切换

一 概述 本节介绍点击标签切换页面&#xff0c;包含以下内容&#xff1a; 点击tab标签卡切换content要显示的内容区域当tab被选中时&#xff0c;高亮显示 二 效果图 三 点击tab标签卡切换content要显示的内容区域 3.1 切换功能说明 切换标签页有两种方式&#xff1a; 直接…

微信小程序radio 标签 使用

记录radio 标签,主要是之前有一个项目 ui设计 选中的在后面刚开始以为需要自定义之类的 后台自己随便弄了下,感觉只需要把文字放在前后即可 radio 标签 代码 wxml <view> <radio-group class"radio-group" bindchange"radioChange"><la…

小程序3D标签云

微信小程序实现3D标签云 在网上查找了许多3d标签云的案列&#xff0c;一般都是用原生和jquery写的&#xff0c;然后参考 https://www.cnblogs.com/axes/p/3501424.html这篇文章 在小程序里面实现标签云&#xff0c;具体代码如下 wxml // An highlighted block <view class…

小程序基础使用

目录 一、简介 1.微信小程序与APP的区别 2.微信小程序的开发 二、小程序开发介绍 1.pages js文件 json文件 wxml文件 wxss文件 2.app.js 3.app.json 4.app.wxss 5.json文件 三、微信小程序的配置 1.全局配置 2.局部配置 四、新建页面路由 1.新建文件夹 2.新建…

微信小程序实现tab标签页的切换及动态的选中下划线移动

微信小程序实现tab标签页的切换及动态的选中下划线移动 注意&#xff1a;当前是横向切换&#xff0c;纵向切换请点击&#xff1a;纵向切换tab 效果演示 代码片段 代码片段链接如下&#xff1a; 微信小程序代码片段 可直接点击代码片段路径观看完整演示。 完整代码 wxml如下 …

微信小程序中使用富文本标签解析

通常情况下后台管理系统都配备了富文本编辑器&#xff0c;所以当数据传入前端的时候需要解析才能够正常使用。 在实际的开发中我们会遇到以下的情况&#xff0c;甚至是更复杂的含有图片和样式等的文本内容。 此时我们就需要借助富文本标签来解析渲染了。如下&#xff1a; 这里…

微信小程序多选标签的实现(单选或者多选)

暑假留在社团跟别人一起开发一个校园小程序&#xff0c;如今也基本快开发完成了&#xff0c;整理一下日后可能用到的小组件。 类似于上图&#xff0c;下方的待选项为一个组件&#xff0c;根据父组件传入传入的参数决定是否为多选。 父组件的HTML代码如下 <view class"…

微信小程序image图片标签(超详细)

微信小程序image图片标签&#xff08;超详细&#xff09; 前言&#xff1a; 因为微信小程序静态打包的图片大小不可超过2m&#xff0c;故应该采取将需要用到的图片上传到网络&#xff0c;通过其链接来操作图片 推荐图床&#xff1a; 路过图床 image{ width: 300px; height…

微信小程序 多标签选择和添加标签

与我之前相关的一个标签的博客&#xff08;时间选择标签&#xff09;&#xff1a; https://blog.csdn.net/weixin_42418774/article/details/98747230 今天我来说说进阶标签的选择和添加标签&#xff1a; 首先我们看到wxml页面布局&#xff1a; wxml:<view classbtn_view…

微信小程序——常用属性及标签

微信小程序 最近在学习小程序开发&#xff0c;在学习的过程中感受到了内容之多&#xff0c;这里总结了一些小程序开发的一些常用属性与方法&#xff0c;更加具体的还得通过打开微信开放文档进行学习&#xff0c;在学习的过程中多打demo才是最好的学习方式啊&#xff0c;再好的文…

微信小程序的标签及常见样式

view 类似div 块状元素 可设置 宽高! fix-direction:row 横向布局 fix-direction:column 纵向布局 横向滑动 标签组件: swiper和swiper-item(单个页面) 一般都是照片! 视屏和音频都可不行,上传代码包大小有限制! swiper组件常用属性: indicator-dots boolean fals…

登录测试用例设计

功能性用例设计点&#xff1a; 1. 输入已注册的用户名和正确的密码&#xff0c;验证是否成功登录 2. 输入已注册的用户名和不正确的密码&#xff0c;验证是否成功失败&#xff0c;且提示信息正确 3. 输入未注册的用户名和任意密码&#xff0c;验证是否登录失败&#xff0…

通用的测试用例编写大全(登录测试/web测试等)

目录 登录 网上资料&#xff1a; 一、基本功能测试&#xff1a; 二、页面测试&#xff1a; 三 、安全测试&#xff1a; 四、性能测试&#xff1a; 五、其它测试&#xff1a; WEB网站测试 一、输入框&#xff1a; 二、提交/确定按钮&#xff1a; 三、后退按钮&#xff…