清晰度检测与增强算法
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