【MATLAB-基于直方图优化的图像去雾技术】

news2024/12/28 19:29:30

【MATLAB-基于直方图优化的图像去雾技术】

  • 1 直方图均衡
  • 2 程序实现
  • 3 局部直方图处理

1 直方图均衡

直方图是图像的一种统计表达形式。对于一幅灰度图像来说,其灰度统计直方图可以反映该图像中不同灰度级出现的统计情况。一般而言,图像的视觉效果和其直方图有对应关系,通过调整或变换其直方图的形状会对图像的显示效果有很大影响。

直方图均衡化主要用于增强灰度值动态范围偏小的图像的对比度,它的基本思想是把原始图像的灰度统计直方图变换为均匀分布形式,这样就增加了像素灰度值的动态范围,从而达到增强图像整体对比度的效果。
在这里插入图片描述

数字图像是离散化的数值矩阵,其直方图可以被视为一个离散函数,表示数字图像中每个灰度级与其出现概率间的统计关系。假设一幅数字图像 f(x,y)的像素总数为 N,r_k表示第 k 个灰度级对应的灰度,n_k表示灰度为r_k 的像素个数即频数,若用横坐标表示灰度级,用纵坐标表示频数,则直方图可被定义为P(r_k)=n_k/N,其中,P(r_k)表示第k灰度出现的相对频数即概率。直方图在一定程度上能够反映数字图像的概貌性描述,包括图像的灰度范围、灰度分布、整幅图像的亮度均值和阴暗对比度等,并可以此为基础进行分析来得出对图像进一步处理的重要依据直方图均衡化也叫作直方图均匀化,就是把给定图像的直方图变换成均匀分布的直方图,是一种较为常用的灰度增强算法。

根据信息论的相关理论,我们可以知道图像在经直方图均衡化后,将会包含更多的信息量进而能突出某些图像特征。假设图像具有 n级灰度,其第级灰度出现的概率为 P_i, 则该级度所含的信息量为:
I ( i ) = p i log ⁡ 1 p i = − p i log ⁡ p i I(i)=p_i \log \frac{1}{p_i}=-p_i \log p_i I(i)=pilogpi1=pilogpi

整幅图像的信息最为:
H = ∑ i = 0 n − 1 I ( i ) = − ∑ i = 0 n − 1 p i log ⁡ p i H=\sum_{i=0}^{n-1} I(i)=-\sum_{i=0}^{n-1} p_i \log p_i H=i=0n1I(i)=i=0n1pilogpi
信息论已经证明,具有均匀分布直方图的图像,其信息量H 最大。即当 P 0 = P 1 = . . . = P n − 1 P_0=P_1=...= P_{n-1} P0=P1=...=Pn1时,H有最大值。

2 程序实现

% 灰度图直方图均衡
% 加载路径和所有文件
clc;clear;close all;
cd(fileparts(mfilename('fullpath')));
addpath(genpath(cd));

if ~isfolder('HistGraph')
    mkdir('HistGraph');
end

Path = '.\';                   % 设置数据存放的文件夹路径
File = dir(fullfile(Path,'*.jpg'));  % 显示文件夹下所有符合后缀名为.txt文件的完整信息
FileNames = {File.name}';            % 提取符合后缀名为.txt的所有文件的文件名,转换为n行1列

for i = 1:size(FileNames,1)
    I = imread(FileNames{i});
    R = I(:,:,1);
    M = histeq(R);

    In = M;
    
    figure;
    subplot(2, 2, 1); imshow(I); title('原图像', 'FontWeight', 'Bold');
    subplot(2, 2, 2); imshow(In); title('处理后的图像', 'FontWeight', 'Bold');
    imwrite(In,['HistGraph\',FileNames{i}],'jpg')
    
    Q = I; 
    W = In;
    subplot(2, 2, 3); imhist(Q, 64); title('原灰度直方图', 'FontWeight', 'Bold');
    subplot(2, 2, 4); imhist(W, 64); title('处理后的灰度直方图', 'FontWeight', 'Bold');
end

在这里插入图片描述

% 彩色图直方图均衡
clear; close all;
I = imread('images\sweden_input.jpg');
R = I(:,:,1);
G = I(:,:,2);
B = I(:,:,3);
M = histeq(R);
N = histeq(G);
L = histeq(B);
In = cat(3, M, N, L);

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');

在这里插入图片描述
全局直方图去雾效果明显,但在图像整体上容易出现色彩失真现象。

3 局部直方图处理

clear; close all;
I = imread('images\sweden_input.jpg');
g1 = GetLocalHisteq(I(:, :, 1));
g2 = GetLocalHisteq(I(:, :, 2));
g3 = GetLocalHisteq(I(:, :, 3));

In = cat(3, g1, g2, g3);

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');

function g = GetLocalHisteq(I)
% 对灰度图像,进行局部直方图均衡化
% 输入参数:
%  I——图像矩阵
% 输出参数:
%  g——结果图像
% 调用库函数adapthisteq,执行局部均衡化增强
g = adapthisteq(I,'clipLimit',0.02,'Distribution','rayleigh');
end

在这里插入图片描述
局部直方图的处理有效保持原图像的局部特征,未出现明显的色彩失真,但该图像整体的亮度偏暗,依然在某些区域模糊。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1050984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++11】完美转发的使用以及万能引用

🌏博客主页: 主页 🔖系列专栏: C ❤️感谢大家点赞👍收藏⭐评论✍️ 😍期待与大家一起进步! 文章目录 一、模板中的&& 万能引用右值引用变量的类型会被编译器识别为左值类型 二、完…

ModuleNotFoundError: No module named ‘taming‘

参考:https://stackoverflow.com/questions/69983020/modulenotfounderror-no-module-named-taming 【问题】 缺少taming模块,错误提示:ModuleNotFoundError: No module named ‘taming’ 【解决】 pip install taming-transformers 若发现安…

计算机毕设 基于时间序列的股票预测于分析

文章目录 1 简介2 时间序列的由来2.1 四种模型的名称: 3 数据预览4 理论公式4.1 协方差4.2 相关系数4.3 scikit-learn计算相关性 5 金融数据的时序分析5.1 数据概况5.2 序列变化情况计算 最后 1 简介 Hi,大家好,这里是丹成学长,今…

利用Pycharm将python文件打包为exe文件

前言 要将Python文件打包为可执行的EXE文件,您可以使用第三方工具,如PyInstaller、cx_Freeze或py2exe等。下面是使用PyInstaller来打包Python文件为EXE文件的步骤: 概述: PyInstaller 是一个用于将 Python 应用程序打包成可执行文件的工具…

大数据Flink(八十八):Interval Join(时间区间 Join)

文章目录 Interval Join(时间区间 Join) Interval Join(时间区间 Join) Interval Join 定义(支持 Batch\Streaming):Interval Join 在离线的概念中是没有的。Interval Join 可以让一条流去 Jo…

kafka伪集群部署,使用docker环境拷贝模式

线上启动容器的方式是复制容器的运行环境出来,然后进行运行脚本的形式 1:在home/kafka目录下创建如下目录 2:复制kafka1容器内的数据/bitnami/kafka/data,直接放在1992_data里面,同理,复制kafka2容器内的数据/bitnami/…

GitHub配置SSH key

GitHub配置SSH key Git配置信息并生成密钥 设置用户名和密码 设置用户名 git config --global user.name "用户名" 设置邮箱 git confir --global user.email "邮箱" 生成密钥 ssh-keygen -t rsa -C "邮箱" 查看密钥 到密钥所保存的位置 复…

cgroup限制cpu使用率

写一段代码&#xff0c;如下所示&#xff0c;可以看到是单核拉满情况 #include <stdio.h> #include <pthread.h>int main() { int i 0; for(;;)i; return 0; }运行起来&#xff0c;通过top命令可以看到cpu使用率大致是100%&#xff0c;如下图所示&#xff1a; …

Python相关知识点

读取zip文件 import zipfilelistAipInfo zipfile.ZipFile(xxx.zip, r) print(listZipInfo.namelist()) # 以列表列出所有压缩文件列出所有被压缩的文件&#xff0c;以及文件名、文件大小和压缩结果大小。 for info in listZipInfo.infolist():print(info.filename, info.…

数据分析三剑客之一:Numpy详解及实战

1 NumPy介绍 NumPy 软件包是Python生态系统中数据分析、机器学习和科学计算的主力军。它极大地简化了向量和矩阵的操作处理。Python的一些主要软件包&#xff08;如 scikit-learn、SciPy、pandas 和 tensorflow&#xff09;都以 NumPy 作为其架构的基础部分。除了能对数值数据…

VMware下的ubuntu虚拟机,实现虚拟机与本地硬盘间的文件互传

本次安装vmware tools工具&#xff0c;以实现二者间的文件互传。 1、打开VMware软件&#xff0c;运行Ubuntu系统虚拟机 安装过程需在ubuntu虚拟机启动的情况下&#xff0c;才能进行安装&#xff1b; 2、安装VMware Tools 在VM主菜单栏中&#xff0c;点击 “虚拟机&#xff0…

【图论C++】Floyd算法(多源最短路径长 及 完整路径)

>>>竞赛算法 /*** file * author jUicE_g2R(qq:3406291309)————彬(bin-必应)* 一个某双流一大学通信与信息专业大二在读 * * brief 一直在算法竞赛学习的路上* * copyright 2023.9* COPYRIGHT 原创技术笔记&#xff…

【AI视野·今日NLP 自然语言处理论文速览 第四十四期】Fri, 29 Sep 2023

AI视野今日CS.NLP 自然语言处理论文速览 Fri, 29 Sep 2023 Totally 45 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers MindShift: Leveraging Large Language Models for Mental-States-Based Problematic Smartphone Use Interve…

【单片机】11-步进电机和直流电机

1.直流电机 1.什么是电机 电能转换为动能 2.常见电机 &#xff08;1&#xff09;交流电机【大功率】&#xff1a;两相【200W左右】&#xff0c;三相【1000W左右】 &#xff08;2&#xff09;直流电机【小功率】&#xff1a;永磁【真正的磁铁】&#xff0c;励磁【电磁铁】 &…

Mysql 安装搭建

文章目录 Mysql 搭建一、安装包下载二、创建用户组用户和修改权限三、配置my.cnf Mysql 搭建 一、安装包下载 mysql 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 这里有所有的mysql的版本&#xff0c;下载自己需要的版本&#xff0c;我们这里下载 …

知识储备--基础算法篇-回溯法

1.回溯法介绍 1.1递归和回溯 每一个递归都包含回溯&#xff0c;回溯是一种纯暴力搜索方法。每个回溯法都可以抽象为一种N叉树。树的宽度为子集的个数&#xff0c;深度为递归返回的条件。二叉树中的递归都会有回溯算法&#xff0c;只不过有些题目用到了&#xff0c;有些没有用…

计算机竞赛 深度学习实现行人重识别 - python opencv yolo Reid

文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的行人重识别算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c…

R语言进行孟德尔随机化+meta分析(2)----基于R和stata

目前不少文章用到了孟德尔随机化meta分析&#xff0c;在上一章咱们简单介绍了一下meta分析的基础知识。咱们今天来介绍一篇11分文章&#xff0c;由文章看看孟德尔随机化meta分析如何进行&#xff0c;文章的题目是&#xff1a;Appraising the causal role of smoking in multipl…

大数据Doris(二):Doris原理篇

文章目录 Doris原理篇 一、Doris 特点 1、支持标准SQL接口 2、列式存储引擎

百度统计配置详细图文教程包含siteId、百度统计AccessToken、百度统计代码获取步骤教程

一、前言 很多网友开发者都不知道百度统计siteId、百度统计token怎么获取&#xff0c;在网上找的教程都是几年前老的教程&#xff0c;因此给大家出一期详细百度统计siteId、百度统计token、百度统计代码获取详细步骤教程。 二、登录到百度统计 1.1 登录到百度统计官网 使用个…