美文网首页
清晰度检测与增强算法

清晰度检测与增强算法

作者: Byte猫 | 来源:发表于2019-05-21 17:02 被阅读0次

    一、清晰度检测

    在无参考图像的质量评价中,图像的清晰度是衡量图像质量优劣的重要指标,它能够较好的与人的主观感受相对应,图像的清晰度不高表现出图像的模糊。

    1、Brenner 梯度函数

    Brenner梯度函数是最简单的梯度评价函数,它只是简单的计算相邻两个像素灰度差的平方.


    import cv2 as cv
    import numpy as np
    import math
    
    def brenner(img):
        '''
        Brenner梯度函数
        INPUT -> 二维灰度图像
        OUTPUT -> 图像越清晰越大
        '''
        shape = np.shape(img)
        out = 0
        for y in range(0, shape[0]):
            for x in range(0, shape[1]-2):
                out+=(int(img[x+2,y])-int(img[x,y]))**2
        return out
    

    2、Laplacian梯度函数

    对每一个像素点计算该处Laplacian算子的卷积后再逐个像素累加。


    G(x,y)是像素点(x,y)处Laplacian算子的卷积

    Laplacian算子定义如下


    def Laplacian(img):
        '''
        Laplacian梯度函数
        INPUT -> 二维灰度图像
        OUTPUT -> 图像越清晰越大
        '''
        return cv.Laplacian(img, cv.CV_64F).var()
    

    3、SMD(灰度差分)函数

    对每一个像素邻域两个灰度差相加后再逐个像素累加。


    def SMD(img):
        '''
        SMD函数
        INPUT -> 二维灰度图像
        OUTPUT -> 图像越清晰越大
        '''
        shape = np.shape(img)
        out = 0
        for y in range(1, shape[0]):
            for x in range(0, shape[1]-1):
                out+=math.fabs(int(img[x,y])-int(img[x,y-1]))
                out+=math.fabs(int(img[x,y]-int(img[x+1,y])))
        return out
    

    4、SMD2(灰度差分乘积)函数

    对每一个像素邻域两个灰度差相乘后再逐个像素累加。


    def SMD2(img):
        '''
        SMD2函数
        INPUT -> 二维灰度图像
        OUTPUT -> 图像越清晰越大
        '''
        shape = np.shape(img)
        out = 0
        for y in range(0, shape[0]-1):
            for x in range(0, shape[1]-1):
                out+=math.fabs(int(img[x,y])-int(img[x+1,y]))*math.fabs(int(img[x,y]-int(img[x,y+1])))
        return out
    

    5、方差函数

    因为清晰聚焦的图像有着比模糊图像更大的灰度差异,可以将方差函数作为评价函数。


    μ为整幅图像的平均灰度值,该函数对噪声比较敏感,图像画面越纯净,函数值越小
    def variance(img):
        '''
        variance函数
        INPUT -> 二维灰度图像
        OUTPUT -> 图像越清晰越大
        '''
        out = 0
        u = np.mean(img)
        shape = np.shape(img)
        for y in range(0,shape[0]):
            for x in range(0,shape[1]):
                out+=(img[x,y]-u)**2
        return out
    

    6、能量梯度函数

    能量梯度函数更适合实时评价图像清晰度


    def energy(img):
        '''
        energy函数
        INPUT -> 二维灰度图像
        OUTPUT -> 图像越清晰越大
        '''
        shape = np.shape(img)
        out = 0
        for y in range(0, shape[0]-1):
            for x in range(0, shape[1]-1):
                out+=((int(img[x+1,y])-int(img[x,y]))**2)*((int(img[x,y+1]-int(img[x,y])))**2)
        return out
    

    7、Vollath函数

    μ为整幅图像的平均灰度值,M和N分别为图像宽和高
    def Vollath(img):
        '''
        Vollath函数
        INPUT -> 二维灰度图像
        OUTPUT -> 图像越清晰越大
        '''
        shape = np.shape(img)
        u = np.mean(img)
        out = -shape[0]*shape[1]*(u**2)
        for y in range(0, shape[0]):
            for x in range(0, shape[1]-1):
                out+=int(img[x,y])*int(img[x+1,y])
        return out
    

    8、熵函数

    基于统计特征的熵函数是衡量图像信息丰富程度的一个重要指标,有信息论可知,一幅图像 f 的信息量是由该图像的信息熵 D(f) 来度量.


    Pi 是图像中灰度值为i的像素出现的概率,L为灰度级总数(通常取值256)

    根据Shannon信息论,熵最大时信息量最多。将此原理应用到对焦过程,D(f)越大则图像越清晰。熵函数灵敏度不高,依据图像内容不同容易出现与真实情况相反的结果。

    def entropy(img):
        '''
        entropy函数
        INPUT -> 二维灰度图像
        OUTPUT -> 图像越清晰越大
        '''
        out = 0
        count = np.shape(img)[0]*np.shape(img)[1]
        p = np.bincount(np.array(img).flatten())
        for i in range(0, len(p)):
            if p[i]!=0:
                out-=p[i]*math.log(p[i]/count)/count
        return out
    

    拓展

    二、清晰度增强

    增强图像清晰度的技术一般被称为超分辨率技术,常见的有基于临近像素点计算的方法、基于图像成像原理的方法、基于贴片的方法以及基于深度神经网络的方法。
    目前效果最好的是基于深度神经网络的方法:
    谷歌超分辨率技术RAISR
    腾讯超分辨率技术TSR

    相关文章

      网友评论

          本文标题:清晰度检测与增强算法

          本文链接:https://www.haomeiwen.com/subject/kfpeaqtx.html