大作业毕设系列基于matlab的直方图优化的图像去雾系统_基于matlab的图像去雾系统毕业设计-程序员宅基地

技术标签: matlab大作业毕设项目  matlab  计算机视觉  人工智能  


前言

雾霾天气往往会给人类的生产和生活带来极大不便,也大大增加了交通事故的发生概率。一般而言,在恶劣天气(如雾天、雨天等)条件下,户外景物图像的对比度和颜色会被改变或退化,图像中蕴含的许多特征也会被覆盖或模糊,这会导致某些视觉系统(如电子卡口、门禁监控等)无法正常工作。因此,从在雾霾天气下采集的退化图像中复原和增强景物的细节信息具有重要的现实意义。数字图像处理技术已被广泛应用于科学和工程领域,如地形分类系统、户外监控系统、自动导航系统等。为了保证视觉系统全天候正常工作,就必须使视觉系统适应各种天气状况。


一、理论基础

图像增强是指按特定的需要突出一幅图像中的某些信息,并同时削弱或去除某些不需要的信息的处理技术。图像增强的主要作用是相对于原来的图像,处理后的图像能更加有效地满足某些特定应用的要求。根据图像处理空间的不同,图像增强方法基本上可分为两大类:频域处理法、空域处理法。频域处理法的基础是卷积定理,它通过进行某种图像变换(如傅里叶变换、小波变换等)得到频域结果并修改的方法来实现对图像的增强处理。空域处理法是直接对图像中的像素进行处理,一般以图像灰度的映射变换为基础并且根据图像增强的目标来采用所需的映射变换,常见的图像对比度增强、图像灰度层次优化等均属于空域处理法。接下来主要介绍
空域的直方图增强算法。

直方图是图像的一种统计表达形式。对于一幅灰度图像来说,其灰度统计直方图可以反映该图像中不同灰度级出现的统计情况。一般而言,图像的视觉效果和其直方图有对应关系,通过调整或变换其直方图的形状会对图像的显示效果有很大影响。
直方图均衡化主要用于增强灰度值动态范围偏小的图像的对比度,它的基本思想是把原始图像的灰度统计直方图变换为均匀分布形式,这样就增加了像素灰度值的动态范围,从而达到增强图像整体对比度的效果。

数字图像是离散化的数值矩阵,其直方图可以被视为一个离散函数,表示数字图像中每个灰度级与其出现概率间的统计关系。假设一幅数字图像 f (x, y)的像素总数为 N,rk表示第 k 个灰度级对应的灰度,nk表示灰度为 rk的像素个数即频数,若用横坐标表示灰度级,用纵坐标表示频数,p(rk)=n/k,,表示p灰度 rk出现的相对频数即概率。直方图在一定程度上能够反映数字图像的概貌性描述,包括图像的灰度范围、灰度分布、整幅图像的亮度均值和阴暗对比度等,并可以此为基础进行分析来得出对图像进一步处理的重要依据。直方图均衡化也叫作直方图均匀化,就是把给定图像的直方图变换成均匀分布的直方图,是一种较为常用的灰度增强算法。直方图均衡化通常包括以下三个主要步骤。
(1)预处理。输入图像,计算该图像的直方图。
(2)灰度变换表。根据输入图像的直方图计算灰度值变换表。
(3)查表变换。执行变换 x’=H(x),表示对在步骤 1 中得到的直方图使用步骤 2 得到的灰
度值变换表进行查表变换操作,通过遍历整幅图像的每一个像元,将原始图像灰度值x放入变换表 H(x)中,可得到变换后的新灰度值 x’。根据信息论的相关理论,我们可以知道图像在经直方图均衡化后,将会包含更多的信息量,进而能突出某些图像特征。假设图像具有 n 级灰度,其第 i 级灰度出现的概率为 pi,则该级灰度所含的信息量为:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从图 1-1、图 1-3 可以看出,原图的像素分布大多集中在 0~25 区间,在直观上偏黑色区域占比较多,难以区分轮胎区域的细节;从图 1-2、图 1-4 可以看出,原图在均衡化后,图像的像素均匀分布在 0~255 区间,在直观上呈现亮度均匀的效果,能较好地看出轮胎区域的细节。因此,直方图均衡化在一定程度上可以提升亮度分布不均、曝光过度等情况的图像可视化效果,是一种较为通用的图像增强方法。

二、程序实现

在这里插入图片描述

1.全局直方图处理

MATLAB 通过函数 imread 读取 RGB 图像,并通过维数为
m *n * 3的矩阵来表示。其中,维数m *n 表示图像的行数、列数信息,维数 3 表示图像的 R、G、B 三层通道数据。因此,全局直方图处理通过对 RGB 图像的 R、G、B 三层通道分别进行直方图均衡化,再整合到新的图像的方式进行。核心代码如下:

function In = RemoveFogByGlobalHisteq(I, flag)
% 对于 RGB 图像,分别对 R、G、B 进行均衡,再得到新的 RGB 图像
% 输入参数:
% I——图像矩阵
% flag——显示标记
% 输出参数:
% In——结果图像
if nargin < 2
 flag = 1;
end
% 提取图像的 R、G、B 分量
R = I(:,:,1);
G = I(:,:,2);
B = I(:,:,3);
% 分别对图像的 R、G、B 分量进行全局直方图均衡化
M = histeq(R);
N = histeq(G);
L = histeq(B);
% 通过集成全局直方图均衡化后的分量来得到结果图像
In = cat(3, M, N, L);
% 结果显示
if flag
 figure;
 subplot(2, 2, 1); imshow(I); title('原图像', 'FontWeight', 'Bold');
 subplot(2, 2, 2); imshow(In); title('处理后的图像', 'FontWeight', 'Bold');
% 灰度化,用于计算直方图
 Q = rgb2gray(I);
 W = rgb2gray(In);
 subplot(2, 2, 3); imhist(Q, 64); title('原灰度直方图', 'FontWeight', 'Bold');
 subplot(2, 2, 4); imhist(W, 64); title('处理后的灰度直方图', 'FontWeight', 
'Bold');
end

在这里插入图片描述

在这里插入图片描述

2.局部直方图处理

全局直方图均衡化增强只是将原图像的直方图进行了均衡化,未能有效保持原始图像的局部特征,容易出现色彩失真问题。通过选择固定大小的滑动窗口作用于原始图像进行局部直方图处理,可以在一定程度上保持原始图像的局部特征,提高图像增强的效果。因此,局部直方图处理通过对 RGB 图像的 R、G、B 三层通道分别进行局部直方图均衡化,再整合到新的图像的方式进行。核心代码如下:

function In = RemoveFogByLocalHisteq(I, flag)
% 对 RGB 图像,分别对 R、G、B 进行均衡,再得到新 RGB 图像
% 输入参数:
% I——图像矩阵
% flag——显示标记
% 输出参数:
% In——结果图像
% 分别对 R、G、B 三层分量进行局部直方图均衡化处理
g1 = GetLocalHisteq(I(:, :, 1));
g2 = GetLocalHisteq(I(:, :, 2));
g3 = GetLocalHisteq(I(:, :, 3));
% 通过集成局部直方图均衡化后的分量得到结果图像
In = cat(3, g1, g2, g3);
% 结果显示
if flag
 figure
  subplot(2, 2, 1); imshow(I); title('原图像', 'FontWeight', 'Bold');
 subplot(2, 2, 2); imshow(In); title('处理后的图像', 'FontWeight', 'Bold');
% 灰度化,用于计算直方图
 Q = rgb2gray(I);
 W = rgb2gray(In);
 subplot(2, 2, 3); imhist(Q, 64); title('原灰度直方图', 'FontWeight', 'Bold');
 subplot(2, 2, 4); imhist(W, 64); title('处理后的灰度直方图', 'FontWeight', 
'Bold');
end
function g = GetLocalHisteq(I)
% 对灰度图像进行局部直方图均衡化
% 输入参数:
% I——图像矩阵
% 输出参数:
% g——结果图像
% 调用库函数 adapthisteq,执行局部均衡化增强
g = adapthisteq(I,'clipLimit',0.02,'Distribution','rayleigh');

在这里插入图片描述
在这里插入图片描述

3.Retinex 增强处理

基于全局直方图、局部直方图的图像去雾算法在理论及实现上比较简单,能起到一定的去雾处理效果。为了进行对比,本次实验采用了 Retinex 图像增强算法进行对比,该算法可以平衡图像灰度动态范围压缩、图像增强和图像颜色恒常三个指标,能够实现对含雾图像的自适应性增强。因此,Retinex 增强处理通过对 RGB 图像的 R、G、B 三层通道分别应用 Retinex 算法进行处理,再整合到新的图像的方式进行。为了提高程序的普适性,我们对部分参数的赋值方式进行了改进,采用随机数取值的方式来生成参数。核心代码如下:

function In = RemoveFogByRetinex(f, flag)
% Retinex 实现图像去雾
% 输入参数:
% f——图像矩阵
% flag——显示标记
% 输出参数:
% In——结果图像
if nargin < 2
 flag = 1;
end
%提取图像的 R、G、B 分量
fr = f(:, :, 1);
fg = f(:, :, 2);
fb = f(:, :, 3);
%数据类型归一化
mr = mat2gray(im2double(fr));
mg = mat2gray(im2double(fg));
mb = mat2gray(im2double(fb));
%定义 alpha 参数
alpha = randi([80 100], 1)*20;
%定义模板大小
n = floor(min([size(f, 1) size(f, 2)])*0.5);
%计算中心
n1 = floor((n+1)/2);
for i = 1:n
 for j = 1:n
 %高斯函数
 b(i,j) = exp(-((i-n1)^2+(j-n1)^2)/(4*alpha))/(pi*alpha);
 end
end
%卷积滤波
nr1 = imfilter(mr,b,'conv', 'replicate');
ng1 = imfilter(mg,b,'conv', 'replicate');
nb1 = imfilter(mb,b,'conv', 'replicate');
ur1 = log(nr1);
ug1 = log(ng1);
ub1 = log(nb1);
tr1 = log(mr);
tg1 = log(mg);
tb1 = log(mb);
yr1 = (tr1-ur1)/3;
yg1 = (tg1-ug1)/3;
yb1 = (tb1-ub1)/3;
%定义 beta 参数
beta = randi([80 100], 1)*1;
%定义模板的大小
x = 32;
for i = 1:n
 for j = 1:n
 %高斯函数
 a(i,j) = exp(-((i-n1)^2+(j-n1)^2)/(4*beta))/(6*pi*beta);
 end
end
%卷积滤波
nr2 = imfilter(mr,a,'conv', 'replicate');
ng2 = imfilter(mg,a,'conv', 'replicate');
nb2 = imfilter(mb,a,'conv', 'replicate');
ur2 = log(nr2);
ug2 = log(ng2);
ub2 = log(nb2);
tr2 = log(mr);
tg2 = log(mg);
tb2 = log(mb);
yr2 = (tr2-ur2)/3;
yg2 = (tg2-ug2)/3;
yb2 = (tb2-ub2)/3;
%定义 eta 参数
eta = randi([80 100], 1)*200;
for i = 1:n
 for j = 1:n
 %高斯函数
 e(i,j) = exp(-((i-n1)^2+(j-n1)^2)/(4*eta))/(4*pi*eta);
 end
end
%卷积滤波
nr3 = imfilter(mr,e,'conv', 'replicate');
ng3 = imfilter(mg,e,'conv', 'replicate');
nb3 = imfilter(mb,e,'conv', 'replicate');
ur3 = log(nr3);
ug3 = log(ng3);
ub3 = log(nb3);
tr3 = log(mr);
tg3 = log(mg);
tb3 = log(mb);
yr3 = (tr3-ur3)/3;
yg3 = (tg3-ug3)/3;
yb3 = (tb3-ub3)/3;
dr = yr1+yr2+yr3;
dg = yg1+yg2+yg3;
db = yb1+yb2+yb3;
cr = im2uint8(dr);
cg = im2uint8(dg);
cb = im2uint8(db);
% 通过集成处理后的分量得到结果图像
In = cat(3, cr, cg, cb);
%结果显示
if flag
 figure;
 subplot(2, 2, 1); imshow(f); title('原图像', 'FontWeight', 'Bold');
 subplot(2, 2, 2); imshow(In); title('处理后的图像', 'FontWeight', 'Bold');
 % 灰度化,用于计算直方图
 Q = rgb2gray(f);
 M = rgb2gray(In);
 subplot(2, 2, 3); imhist(Q, 64); title('原灰度直方图', 'FontWeight', 'Bold');
 subplot(2, 2, 4); imhist(M, 64); title('处理后的灰度直方图', 'FontWeight', 
'Bold');
end

在这里插入图片描述

总结

基于图像处理的去雾增强技术可以显著提高对比度,突出图像细节,提升视觉效果,该方法已被广泛应用于项目实践中。基于直方图均衡化模型的去雾方法针对性强,运行效率高,且易于融合于其他图像增强算法,所以该技术必将获得进一步的发展。尽管图像去雾技术在实际应用中已经取得了若干成果,但在不同的场景下依然面临某些局限性,需要引起研究人员的进一步关注。

源码下载

订阅此专栏可以获得:源码+文档+运行视频
链接: link

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44779079/article/details/133972640

智能推荐

分布式光纤传感器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告_预计2026年中国分布式传感器市场规模有多大-程序员宅基地

文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大

07_08 常用组合逻辑电路结构——为IC设计的延时估计铺垫_基4布斯算法代码-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码

OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版

关于美国计算机奥赛USACO,你想知道的都在这_usaco可以多次提交吗-程序员宅基地

文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗

MySQL存储过程和自定义函数_mysql自定义函数和存储过程-程序员宅基地

文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程

半导体基础知识与PN结_本征半导体电流为0-程序员宅基地

文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0

随便推点

【Unity3d Shader】水面和岩浆效果_unity 岩浆shader-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader

广义线性模型——Logistic回归模型(1)_广义线性回归模型-程序员宅基地

文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型

HTML+CSS大作业 环境网页设计与实现(垃圾分类) web前端开发技术 web课程设计 网页规划与设计_垃圾分类网页设计目标怎么写-程序员宅基地

文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写

C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁_.net dll 全局目录-程序员宅基地

文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录

BRIEF特征点描述算法_breif description calculation 特征点-程序员宅基地

文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点

房屋租赁管理系统的设计和实现,SpringBoot计算机毕业设计论文_基于spring boot的房屋租赁系统论文-程序员宅基地

文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文