清晰度检测与增强算法

2019-05-21  本文已影响0人  Byte猫

一、清晰度检测

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

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

上一篇下一篇

猜你喜欢

热点阅读