非参考评价指标UIQM

自己留个笔记

underwater image quality

无参考水下图像质量评价指标,色彩测量指标(UICM),清晰度测量指标(UISM),对比度测量指标(UIConM)作为评价依据,将UIQM表示为三者的线性组合。其值越大,表示图像的颜色平衡、清晰度、对比度越佳

UISM(清晰度)

UISM =\sum_{c=1}^{3}\lambda c{EME}(grayscale \quad edge)

EME

EME=\frac{2}{k_1k_2}\sum_{l=1}^{k_1}\sum_{k=1}^{k_2}log\frac{I_{max},k,l}{I_{min},k,l}

EME指标主要用于评估图像的失真情况,可以在图像编码压缩、图像传输以及图像处理等领域中应用。它的优点是对图像的局部质量变化敏感,并且与人眼主观感知相对一致,而缺点是计算过程相对复杂,且需要参照人类主观评价来进行调整和校准。

是一种用于图像质量评价的指标。它是基于人眼视觉感知的图像质量评价算法之一,用于量化图像的失真程度和视觉质量的差异。

使用的是RGB颜色空间

图片被分为K1*K2个区域,log中的分式是每个区域中亮度最大与最小值的比值,即对比度,算出RGB三通道的EME,带入到UISM公式中,其中λc中λR=0.299,λG=0.587,λB=0.114

UISM代码块
import cv2
import math
import numpy as np
def EME(rbg, L):
    m, n = np.shape(rbg)  # 横向为n列 纵向为m行
    number_m = math.floor(m / L)
    number_n = math.floor(n / L)
    # A1 = np.zeros((L, L)) #创建一个L*L的全0数组用于存放 #用不用没有差别
    m1 = 0
    E = 0
    for i in range(number_m):  # 将图片按照L*L分成小块 其余的部分舍去
        n1 = 0
        for t in range(number_n):
            A1 = rbg[m1:m1 + L, n1:n1 + L]
            rbg_min = np.amin(np.amin(A1))
            rbg_max = np.amax(np.amax(A1))

            if rbg_min > 0:
                rbg_ratio = rbg_max / rbg_min
            else:
                rbg_ratio = rbg_max  ###
            E = E + np.log(rbg_ratio + 1e-5)

            n1 = n1 + L
        m1 = m1 + L
    E_sum = 2 * E / (number_m * number_n)
    return E_sum

def UISM(img):
    r, b, g = cv2.split(img)
    EME_r = EME(r, 5)  # 这里设置的L为5
    EME_b = EME(b, 5)
    EME_g = EME(g, 5)
    uism = 0.299 * EME_r + 0.144 * EME_b + 0.587 * EME_g
    return uism
img = cv2.imread(r'D:/project2/pythonProject/xiufu-1/airplane.jpg')  # 读取图片
UISM=UISM(img)
print(UISM)
# 结果:0.4382840341741828

UICM (色彩)

import math

import cv2


def mu_a(x,alpha_L=0.1,alpha_R=0.1):
    x=sorted(x)
    K=len(x)
    T_a_L=math.ceil(alpha_L*K)
    T_a_R=math.ceil(alpha_R*K)
    weight=(1/(K-T_a_R-T_a_L))
    a=int(T_a_L+1)
    b=int(K-T_a_R)
    val=sum(x[a:b])
    val=val*weight
    return val
def s_a(x,mu):
    val=0
    for pixel in x:
        val+=math.pow((pixel-mu),2)
    return val/len(x)

def uicm(x):
    #分别得到三个通道
    R=x[:,:,0].flatten()
    G=x[:,:,1].flatten()
    B=x[:,:,2].flatten()
    RG=R-G
    YB=((R+G)/2)-B
    mu_RG=mu_a(RG)
    mu_YB=mu_a(YB)
    a_RG=s_a(RG,mu_RG)
    a_YB=s_a(YB,mu_YB)
    A=math.sqrt(math.pow((mu_RG),2)+math.pow((mu_YB),2))
    B=math.sqrt(a_RG+a_YB)
    uicm=(-0.0268*A)+(0.1586*B)
    return uicm

img = cv2.imread(r'D:/project2/pythonProject/xiufu-1/cur.png')  # 读取图片
UICM=uicm(img)
print(UICM)

# 结果:16733664754.867203⁉️
#
# 14.553925744927325

计算过程

  1. 图像预处理:对待评价的图像进行预处理,例如去噪、直方图均衡化等,以提取图像的基本特征。
  2. 特征提取:从预处理后的图像中提取一系列特征。通常使用的特征包括对比度、亮度、纹理、颜色分布等。这些特征可以通过统计方法或者使用计算机视觉算法进行提取。
  3. 特征映射:对提取的特征进行映射和转换,将每个特征映射到一个质量空间中,表示该特征对图像质量的贡献。这个映射过程可以是线性的,也可以是非线性的。
  4. 加权组合:将映射后的特征进行加权组合,得到最终的图像质量度量值。可以使用线性加权或者非线性加权的方式进行特征的组合。加权系数的选择通常需要基于大量主观主观质量评价数据进行训练和调整。

最终得到的UICM分数表示图像的视觉质量,较高的分数表示较好的图像质量,而较低的分数表示较差的图像质量。

需要注意的是,UICM作为一种无参考的质量评价指标,其结果仅与输入图像本身有关,不涉及原始图像的对比。然而,UICM的准确性和适用性仍然会受到诸多因素的影响,如图像内容、失真类型和感知主观差异等。

    weight=(1/K-T_a_R-T_a_L)

这里错了---➡️weight=(1/(K-T_a_R-T_a_L))

采用Lab颜色空间(Lab基于人对颜色的感受),其三要素:亮度(L),表示色彩的两个参量a,b。a表示洋红色到绿色,b表示黄色到蓝色。

1、RG即a,YB即b
RG=R-G;
YB=(R+G)/2-B

图片像素数K=M*N,对于所有的像素按从小到大排序X1<=X2……<=XK。(此处计算仅以RG为例,YB同理)

2、计算平均值:
 


3、计算方差:
 


4、分析:μ越接近0则平衡越好,σ2越大色彩对比度越好

UICM=-0.0268\sqrt{​{\mu_{\alpha,RG}}^2+{\mu_{\alpha,YB}}^2}+0.1586\sqrt{​{\sigma_{\alpha,RG}}^2+{\sigma_{\alpha,YB}}^2}

(所以这里要先求出均值和方差)

UIConM(对比度)

UIConM

  1. 将输入图像转换为灰度图像,如果图像不是灰度图像的话。
  2. 计算图像中每个像素的灰度值。
  3. 计算图像的平均灰度值,可以通过将所有像素值相加并除以像素总数得到。
  4. 计图像的标准差其中,(N 表示总像素数,x_i 表示每个像素的灰度值,μ 表示图像的平均灰度值。)
  5. 得到的标准差即为 UIConM 值,表示图像的对比度测量指标

import numpy as np


def uiconm(x, window_size):

    plip_lambda = 1026.0
    plip_gamma  = 1026.0
    plip_beta   = 1.0
    plip_mu     = 1026.0
    plip_k      = 1026.0
    # if 4 blocks, then 2x2...etc.
    k1 = x.shape[1]/window_size
    k2 = x.shape[0]/window_size
    # weight
    w = -1./(k1*k2)
    blocksize_x = window_size
    blocksize_y = window_size
    # make sure image is divisible by window_size - doesn't matter if we cut out some pixels
    # x = x[:blocksize_y*k2, :blocksize_x*k1]
    x = x[:int(blocksize_y * k2), :int(blocksize_x * k1)]
    # entropy scale - higher helps with randomness
    alpha = 1
    val = 0
    for l in range(int(k1)):
        for k in range(int(k2)):
            block = x[k*window_size:window_size*(k+1), l*window_size:window_size*(l+1), :]
            max_ = np.max(block)
            min_ = np.min(block)
            top = max_-min_
            bot = np.add(max_, min_)

            if math.isnan(top) or math.isnan(bot) or bot == 0.0 or top == 0.0: val += 0.0
            else: val += alpha*math.pow((top/bot),alpha) * math.log(top/bot)
            #try: val += plip_multiplication((top/bot),math.log(top/bot))
    return w*val
报错:

出现了溢出的情况

👌尝试解决:

import numpy as np
bot = np.add(max_, min_)

UIQM

def getUIQM(x):
    """
      Function to return UIQM to be called from other programs
      x: image
    """
    x = x.astype(np.float32)
    ### UCIQE: https://ieeexplore.ieee.org/abstract/document/7300447
    #c1 = 0.4680; c2 = 0.2745; c3 = 0.2576
    ### UIQM https://ieeexplore.ieee.org/abstract/document/7305804
    c1 = 0.0282; c2 = 0.2953; c3 = 3.5753
    uicm   = _uicm(x)
    uism   = _uism(x)
    uiconm = _uiconm(x, 10)
    uiqm = (c1*uicm) + (c2*uism) + (c3*uiconm)
    return uiqm
from glob import glob
from os.path import join

import numpy as np
from PIL import Image
from uicm import uicm
from uiconm import uiconm

from uism import uism


def UIQM(x):
    x = x.astype(np.float32)
    print(x.shape)
    # UIQM :
    c1 = 0.0282
    c2 = 0.2953
    c3 = 3.5753
    UICM = uicm(x)
    UISM = uism(x)
    UIconM = uiconm(x, 10)
    UiQM = (c1 * UICM) + (c2 * UISM) + (c3 * UIconM)
    return UiQM


def measure_UIQM(dir_name, img_resize=(256, 256)):
    paths = sorted(glob(join(dir_name, "*.*")))
    uiqm = []
    for img_path in paths:
        img = Image.open(img_path).resize(img_resize)
        Uiam = UIQM(np.array(img))
        uiqm.append(Uiam)
    return np.array(uiqm)



dir_name = 'D:/project2/pythonProject/practice-well/date11/'  # 读取图片
inp_uiqm=measure_UIQM(dir_name)
print("UIQM:{}".format(inp_uiqm))
print("UIQM:\nmeam:{0}   \nstd:{1}".format(np.mean(inp_uiqm),np.std(inp_uiqm)))



 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
图像质量评价指标UIQM(Underwater Image Quality Measure)是用于评估水下图像质量的一种指标。它是基于感知的图像质量评价模型,旨在提供更准确、更符合人眼感知的图像质量评价结果。 UIQM综合考虑了图像亮度、对比度和饱和度等因素。其中,图像亮度指标评估图像是否具有明确的亮度信息,对图像的视觉感知影响较大。对比度指标评估图像中不同区域的灰度差异,对图像的视觉感知和细节呈现能力有影响。饱和度指标评估图像的颜色饱和度,衡量图像中颜色的鲜艳程度。 UIQM通过计算这些指标的加权系数,综合评价图像的质量。通过与主观评价的实验证明,UIQM能够有效地模拟人眼对水下图像质量的感知,具有较高的准确性和稳定性。 UIQM的应用广泛,可用于水下图像采集、处理和传输等方面。对于水下摄像机和图像处理算法的研发,UIQM可以作为一个客观的评价指标,帮助改进水下图像质量和细节的捕捉。同时,在水下影像的传输和压缩中,UIQM也可以用于评估不同压缩算法对图像质量的影响,提供有效的参考依据。 总而言之,UIQM是一种用于评估水下图像质量的指标,具有较高的准确性和稳定性。它综合考虑了图像的亮度、对比度和饱和度等因素,能够模拟人眼对水下图像质量的感知,对水下影像的研究和应用具有重要意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值