图片合成雾的方法概述

本文介绍了两种图像合成雾的方法:RGB通道合成和标准光学模型合成。RGB通道法通过调整RGB值模拟面纱效果;标准光学模型法基于1924年的光学模型,包括中心点合成和深度图像信息合成,考虑了透射率和物体距离。深度信息合成能产生更真实的效果,但对输入图像质量要求较高。合成雾可用于模拟雾天数据集,解决数据收集困难的问题。
摘要由CSDN通过智能技术生成

图片合成雾的方法总结

前言

  由于雾天数据集的收集困难,再加以更新数据标签成本花费很大,同时也没有过多的开源数据集,因此,研究合成雾数据集进行雾天图片研究的基础。
  最近研究了一下图像合成雾的方法,看了一些文献以及查找了一些方法,如下为各位学习的同学进行整理,便于满足自身的科研需要,减少不必要的时间花费。

  目前主流的方法总结为以下两种:

  1.通过RGB通道合成雾。

  2.通过标准光学模型合成雾。

RGB通道合成雾

  首先,考虑什么是RGB通道合成雾?我的直观的理解就是我们选择一张纯色的纸(纸的色彩通过调整RGB三通道确定),这张纸不是理想的不透光的纸,相反像女生使用的那种面纱的感觉,这种面纱的稀疏程度(或透光程度)确定了合成雾的程度,而纸的颜色确定了雾的颜色(色彩的调节可以呈现出雾、霾和沙尘等效果,需要小伙伴耐心调节代码啦)。

  以下为RGB通道方法的合成雾方法:

参考链接

import numpy as np
import cv2 as cv
import os
import random
import cv2
file = 'F:\\PyCharm 2019.3.3\\pycharm\\picture\\' # 图片文件夹的输入路径

for file_img in os.listdir(file):  # 需要处理的文件夹
    img = cv.imread(file + file_img)  # 需要处理的文件夹
    mask_img = cv.imread(file + file_img)  # 需要处理的文件夹
    # mask_img[:, :] = (144, 128, 112)  # 112, 128, 144 RGB 三种颜色相同时为灰度色彩
    # mask_img[:, :] = (166, 178, 180)  # 雾的颜色可以调整,看看哪个效果符合自身的需要
    mask_img[:, :] = (220, 220, 220)
    image = cv.addWeighted(img, round(random.uniform(0.1, 0.1), 2), mask_img, 1, 0)  # 里面参数可调,主要调整雾的浓度(0.1, 0.1)这两个参数控制雾的浓度,多调整下就懂了
    cv2.imwrite(file_img, image) # 保存文件,图片名称和输入的相同,可以自己设置更改

合成雾图片效果展示:

图片原图 合成雾图片

  可以看出,图片合成雾效果如同我上述描述一般,一层面纱进入了原图,展现了合成物图片的“神秘面纱”,通过参数调节可以达到高效的合成雾图片。

标准光学模型合成雾

  首先,在介绍标准光学模型合成雾方法时,应该要介绍标准光学模型。在1924年,一位科学伟人提出的标准光学模型,之后一直到如今,除雾领域很多都是基于此进行图像处理的。标准光学模型如下:

                                              𝐼(𝑥)=J(𝑥)𝑡(𝑥)+𝐿(1−𝑡(𝑥))

  其中 I ( x ) I(x) I(x)为有雾图像, x x x为图像像素的坐标值, J ( x ) J(x) J(x)为待恢复的去雾图像, L L L为全球大气光成分, t ( x ) t(x) t(x)为透射率。

参考链接

借他人图片给解释一下

  如上图所示,在朦胧天气中成像的过程。反射能量减少引起的传输衰减 J ( x ) t ( x ) J(x)t(x) J(x)t(x)导致亮度低。由周围照明散射形成的空气光 L ( 1 − t ( x ) ) L(1-t(x)) L(1t(x))增强了亮度,降低了饱和度。有雾图像的形成是被雾削弱的物体反射的光线和被雾反射的大气光进去摄像机共同组成的,把雾的削弱和放射性能用t(x)表示,它与物体到摄像机的景深有关。最简单的理解就是雾天影响了一个物体自身的反射现象,而另一个就是相机的拍摄效果,两者的综合导致图片的雾效果。

  在解释完标准光学模型后,对当前的图片雾合成方法进一步总结:

  1.中心点合成雾

  2.深度图像信息合成雾

中心点合成雾

  所谓的中心点合成雾是指通过雾图片的一个中心点进行雾合成扩散,距离雾中心点的距离越远,雾合成的效果越弱。

参考链接

import cv2, math
import numpy as np
import random

def demo():
    img_path = '1.png' # 图片地址和名称,默认是同一层文件地址,如有需要可更改。

    img = cv2.imread(img_path) 
    img_f = img / 255.0 # 归一化
    (row, col, chs) = img.shape

    A = 0.5  # 亮度
    beta = 0.000005  # 雾的浓度
    #beta = betaa[random.randint(0,len(betaa)-1)] # 随机初始化雾的浓度
    size = math.sqrt(max(row, col))  # 雾化尺寸,可根据自己的条件进行调节,一般的范围在中心点位置但不是很大,可自己手动设置参数
    # size = 40 # 这是我自己设置的参数,效果很不错
    center = (row // 2, col // 2)  # 雾化中心 就是图片的中心
    for j in range(row):
        for l in range(col):
            d = -0.04 * math.sqrt((j - center[0]) ** 2 + (l - center[1]) ** 2) + size
            td = math.exp(-beta * d)
            img_f[j][l][:] = img_f[j][l][:] * td + A * (1 - td) # 标准光学模型,图片的RGB三通道进行加雾
    cv2.imwrite('1.png', img_f*255) # 图片生成名字,切记务必要回复图片 *255,否则生成图片错误,可以尝试
    cv2.imshow("src", img)
    cv2.imshow("dst", img_f) # 显示图片

if __name__ == '__main__':
    demo()

  细心的同学可以想到,中心点合成雾可以达到RGB通道合成雾一样的效果,怎么说?把中心点放大,然后合成区域够大是,距离对图片合成物就没有影响,因此中心点合成物效果相同。上述代码也可以进行对文件夹中图片进行遍历合成物,仿照RGB通道方法即可。

  同时,以下提供matlab代码,此代码是经过我稍加修改后的效果

参考链接

clear all;clc;

dirs = dir('*.jpg'); % 搜索.m文件地址下的.jpg图片信息
dirnum = length(dirs); % 图片的数量
dircell = struct2cell(dirs)';
filenames = dircell(:, 1);
   
for len=1:dirnum            % 进行图片的遍历
    img_name=filenames{len};
    I=imread(img_name);
    I = double(I)/255;
    Im_dealt = I;
    [row,col,z] = size(Im_dealt);
    landline = 0;
    AA = [0.8 0.85 0.9 0.95 1]; 
    beta = [0.1 0.2 0.04 0.06 0.08 0.12 0.16];
    rand1 = unidrnd(5); 
    rand2 = unidrnd(7);
    
    Iw = I;
    m = 100;
    n = 300;
	% 随机选择标准光学模型下的参数,保证数据集图片的多样i选哪个
    betaA = beta(rand2); % 对上述的值进行随机选择,保证在数据集中有不同程度的雾图片信息
    A = AA(rand1); % 同上条内容一样,保证了随机性
    
    for i=1:3
        for j=landline+1:row
            for l=1:col
                d(j,l) = 1/((j-landline)^.05 + 0.0001);
                d2(j,l) = d(j,l)*8;
                if j < landline
                    d(j,l) = -0.04*landline + 18;
                    td(j,l) = exp(-betaA*d(j,l));
                    Iw(j,l,i) = I(landline,l,i)*td(landline,l) + A*(1-td(j,l));
                else
                	try
                    	d(j,l) = -0.04*sqrt((j-m).^2+(l-n).^2) + 17;
                    	td(j,l) = exp(-betaA*d(j,l));
                    	Iw(j,l,i) = I(j,l,i)*td(j,l) + A*(1-td(j,l));
                	catch
                		break % 防止出现黑白单通道图片报错。
                	end
                end
            end
        end
    end
    for k = 1:landline
        for kj = 1:col
            Iw(k,kj,: ) = Iw(landline+1,100,:);
        end
    end

    filename = ['./result/',filenames{len}(1:end-4),'.jpg']; % 保存图片的地址和名称,这里我是根据自己图片的命名方式,设置图片的命名规格,需要更改为自己的图片命名方式
    imwrite(Iw,filename);
end

  完美解决图片合成问题,需要修改合成物效果,进行参数调节和修改,达到自己满意的程度。

深度图像信息合成雾

  在阅读了大量的文献后,发现了一个新大陆,就是借助图片的深度信息,考虑图片中的物体,以及距离等信息,进一步的合成雾图片,基本原理都是基于标准光学模型产生,感兴趣的同学可以查SCI原文“Semantic Foggy Scene Understanding with Synthetic Data”进行详细阅读。

  数据如下,也可以在GitHub上自己下载

  链接:https://pan.baidu.com/s/1-TqIdsh2KnrW6XmrTMLBUg

  提取码:v9ps

  下载后运行demo.m文件即可,结果在output文件中,想要使用此代码需要细读demo代码,基本原理都是基于标准光学模型,在此方法中更多的考虑了距离等信息,实现效果较好,数据集采用的是Cityscape数据集,如下图所示。

图片原图 合成雾后图片

  看效果后,可以说大吃一惊。但是也不要高兴的过早,因为效果好的合成雾图片要求也会很高,比如,要求图片的深度信息图片效果要好,一般我们采用视觉传感器采集信息包含的深度信息图像效果并不如上图的效果一样好,而上图的数据集是模拟环境下的效果及深度信息图像,因此。考虑到实际的情况,可以使用其数据集进行自己的模型训练,但是使用自己采集的图像及深度信息图像进行合成会发现效果不理想。

总结

  本文重点整理了目前的图片合成雾的方法,主要有两种,一种是RGB通道合成雾,另一种是标准光学模型合成雾(中心点合成物和深度信息合成雾)。大家要明白简单的方法对于图片的要求低,合成雾的效果也较差,但合成雾效果好的方法,对图片的要求也较高,因此,应该根据自己研究的需要进行方法的选择,切记不要盲目使用,适合自己的才是最好的,奥里给!

评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting_1997

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值