python图像去雾总结

本人qq号:226607573,欢迎互相讨论的伙伴们

毕设期间对python图像去雾的学习与总结

近年来,雾霾越来越严重,导致户外获取的图像严重退化,何如将户外获取的有雾图像复原成高质量的清晰图像,已成为众多研究者的共同目标。

常用的图像去雾方法有以下几种:

1.暗通道去雾
2.色阶调整去雾
3.直方图均衡化
4.Retinex

何凯明博士–暗通道去雾算法

原理:暗通道处理是一个假设, 在绝大多数非天空的局部区域里,某一些像素总会有至少一个颜色通道有很低的值。换言之,该区域光强度的最小值是个很小的数。
**
暗通道可以用下式表达:

  • 在这里插入图片描述
    暗通道先验的理论指出:

在这里插入图片描述

实际生活中造成暗原色中低通道值主要有三个因素:

  • a)汽车、建筑物和城市中玻璃窗户的阴影,或者是树叶、树与岩石等自然景观的投影;
  • b)色彩鲜艳的物体或表面,在RGB的三个通道中有些通道的值很低(比如绿色的草地/树/植物,红色或黄色的花朵/叶子,或者蓝色的水面);
  • c)颜色较暗的物体或者表面,例如灰暗色的树干和石头。总之,自然景物中到处都是阴影或者彩色,

在这里插入图片描述

**

I(X)就是我们现在已经有的图像(待去雾的图像)

J(x)是我们要恢复的无雾的图像,A是全球大气光成分, t(x)为透射率

**
找出每个像素的RGB三通道的最小值、形成图像的暗通道图像

展示去雾效果

原图片
在这里插入图片描述
在这里插入图片描述
处理后图片
在这里插入图片描述

图片增强代码:

图片增强算法一:

def zmMinFilterGray(src, r=7):                #如果比最小值小,则替换中心像
                                              #素为最小值,如果中心像素比最大值大,则替换中心像素为最大值。s
    '''最小值滤波,r是滤波器半径'''           #求最小值滤波图像用来作为引导滤波的引导图像
    '''if r <= 0:
        return src
    h, w = src.shape[:2]                                 
    I = src
    res = np.minimum(I  , I[[0]+range(h-1)  , :])        #元素集的最小值计算
    res = np.minimum(res, I[range(1,h)+[h-1], :])
    I = res
    res = np.minimum(I  , I[:, [0]+range(w-1)])
    res = np.minimum(res, I[:, range(1,w)+[w-1]])
    return zmMinFilterGray(res, r-1)'''
    return cv2.erode(src, np.ones((2 * r + 1, 2 * r + 1)))  # 使用opencv的erode函数更高效
def guidedfilter(I, p, r, eps):                   #去雾1
     #输入图像V1,引导图像p
    height, width = I.shape                       #a,b是以像素k为窗口的周围的权重的均值
    m_I = cv2.boxFilter(I, -1, (r, r))            #方框滤波,m_I 窗口W的均值
    m_p = cv2.boxFilter(p, -1, (r, r))            #m_p  = q受到噪声n污染的退化图像
    m_Ip = cv2.boxFilter(I * p, -1, (r, r))       #I * P 的累加
    cov_Ip = m_Ip - m_I * m_p                     #分子

    m_II = cv2.boxFilter(I * I, -1, (r, r))       #用于求方差
    var_I = m_II - m_I * m_I                      #窗口W的方差

    a = cov_Ip / (var_I + eps)                      #a,b窗口中心位于 k 时该线性函数的不变系数
    b = m_p - a * m_I

    m_a = cv2.boxFilter(a, -1, (r, r))
    m_b = cv2.boxFilter(b, -1, (r, r))
    return m_a * I + m_b
def getV1(m, r, eps, w, maxV1):  # 输入rgb图像,值范围[0,1]        去雾1
    '''计算大气遮罩图像V1和光照值A, V1 = 1-t/A'''
    V1 = np.min(m, 2)  # 得到暗通道图像,每个像素RGB分量中的最小值
    V1 = guidedfilter(V1, zmMinFilterGray(V1, 7), r, eps)  # 使用引导滤波优化
    bins = 2000
    ht = np.histogram(V1, bins)  # 计算大气光照A    #写入直方图
    d = np.cumsum(ht[0]) / float(V1.size)      #元素累加
    for lmax in range(bins - 1, 0, -1):
        if d[lmax] <= 0.999:
            break
    A = np.mean(m, 2)[V1 >= ht[1][lmax]].max()

    V1 = np.minimum(V1 * w, maxV1)  # 对值范围进行限制

    return V1, A
def deHaze(m, r=81, eps=0.001, w=0.9, maxV1=0.80, bGamma=False):  #去雾1
    Y = np.zeros(m.shape)                            #定义一个零矩阵
    V1, A = getV1(m, r, eps, w, maxV1)  # 得到遮罩图像和大气光照
    for k in range(3):
        Y[:, :, k] = (m[:, :, k] - V1) / (1 - V1 / A)  # 颜色校正
    Y = np.clip(Y, 0, 1)
    if bGamma:
        Y = Y ** (np.log(0.5) / np.log(Y.mean()))  # gamma校正,默认不进行该操作
    return Y

还在更新中。**

常用的图像增强方法有以下几种:

1.提高对比度
2.Gamma校正
3.直方图均衡化
均值滤波方法:对待处理的当前像素,选择一个模板,该模板为其邻近的若干个像素组成,用模板的均值来替代原像素的值的方法。

中值滤波方法:对待处理的当前像素,选择一个模板,该模板为其邻近的若干个像素组成,对模板的像素由小到大进行排序,再用模板的中值来替代原像素的值的方法。

使用python自带的图像处理库PIL的ImageEnhance模块

1、对比度:白色画面(最亮时)下的亮度除以黑色画面(最暗时)下的亮度
2、色彩饱和度::彩度除以明度,指色彩的鲜艳程度,也称色彩的纯度
3、色调:向负方向调节会显现红色,正方向调节则增加黄色。适合对肤色对象进行微调
4、锐度:是反映图像平面清晰度和图像边缘锐利程度的一个指标

展示增强效果

原图片
在这里插入图片描述
处理后图片
在这里插入图片描述

图片增强代码:

图片增强算法一:

def m_filter(x, y, step):    # 增强
    """中值滤波函数"""
    sum_s = []  # 定义空数组
    for k in range(-int(step / 2), int(step / 2) + 1):
        for m in range(-int(step / 2), int(step / 2) + 1):
            sum_s.append(img_zq[x + k][y + m])  # 把模块的像素添加到空数组
    sum_s.sort()  # 对模板的像素由小到大进行排序
    return sum_s[(int(step * step / 2) + 1)]
def Contrast_and_Brightness(alpha, beta, img):              # 对比度、亮度增强    增强
    """使用公式f(x)=α.g(x)+β"""
    # α调节对比度,β调节亮度
    blank = np.zeros(img.shape, img.dtype)  # 创建图片类型的零矩阵
    dst = cv2.addWeighted(img, alpha, blank, 1 - alpha, beta)  # 图像混合加权
    return dst
  def img_enhance(): 
       # 亮度增强
        enh_bri = ImageEnhance.Brightness(image)
        brightness = 1.2
        image_brightened = enh_bri.enhance(brightness)

        # 色度增强
        enh_col = ImageEnhance.Color(image_brightened)
        color = 1.2
        image_colored = enh_col.enhance(color)

        # 对比度增强
        enh_con = ImageEnhance.Contrast(image_colored)
        contrast = 1.2
        image_contrasted = enh_con.enhance(contrast)

        # 锐度增强
        enh_sha = ImageEnhance.Sharpness(image_contrasted)
        sharpness = 3.0
        image_sharped = enh_sha.enhance(sharpness)

还在更新中

  • 5
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值