基于HSI和局部同态滤波的彩色图像增强
简介
在图像采集过程中,由于光照环境或物体表面反光等原因会造成图像光照不均 。图像的光照不均会直接影响图像分析的结果。因此,对光照不均图像进行增强,消除光照的影响是光照不均图像处理中不可缺少的环节 。同态滤波是光照不均图像增强常用的方法。同态滤波增强是从图像的整体角度对光照不均进行修正,虽然可以很好地保持图像的原始面貌,但它没有充分考虑图像的空间局部特性,在增强图像某部分像素时,易导致另一部分像素过增强 。因此,局部同态滤波算法对图像的各个子图像分别进行同态滤波,并对局部同态滤波产生的块效应采用相邻子图像边界平均的方法进行去除。
项目源码地址:https://github.com/gain-wyj/Color-image-enhancement
欢迎大家star
HSI 颜色模型
HSI 颜色模型是一种直观的颜色模型,它从人眼视觉系统出发,用 H(Hue)、S(Saturation)和 I(Intensity)分别表示色调、饱和度和亮度 3 种独立的颜色特征。HSI 模型的建立基于两个重要的事实:其一,I 分量与图像的彩色信息无关;其二,H 和 S 分量与人感受颜色的方式是一致的。这些特点使得 HSI 模型非常适合借助于人的视觉系统来感知彩色特性的图像处理算法。
色调H(Hue):与光波的频率有关,它表示人的感官对不同颜色的感受,如红色、绿色、蓝色等,它也可表示一定范围的颜色,如暖色、冷色等。
饱和度S(Saturation):表示颜色的纯度,纯光谱色是完全饱和的,加入白光会稀释饱和度。饱和度越大,颜色看起来就会越鲜艳,反之亦然。
亮度I(Intensity):对应成像亮度和图像灰度,是颜色的明亮程度。
若将RGB单位立方体沿主对角线进行投影,可得到六边形,这样,原来沿主对角线的灰色都投影到中心白色点,而红色点(1,0,0)则位于右边的角上,绿色点(0,1,0)位于左上角,蓝色点(0,0,1)则位于左下角。
HSI颜色模型的双六棱锥表示,I是强度轴,色调H的角度范围为[0,2π],其中,纯红色的角度为0,纯绿色的角度为2π/3,纯蓝色的角度为4π/3。饱和度S是颜色空间任一点距I轴的距离。当然,若用圆表示RGB模型的投影,则HSI色度空间为双圆锥3D表示。
注意: 当强度I=0时,色调H、饱和度S无定义;当S=0时,色调H无定义。
RGB 模型转换到 HSI 模型
给的一幅 RGB 彩色格式的图像,对[0,1]范围内的 R、G、B值,其对应的 HSI 模型中的 I、S、H 分量的计算公式分别为:
HSI 模型转换到 RGB 模型
S 和 I 的值在[0,1]之间,R、G、B 的值也在[0,1]之间,HSI模型转换为 RGB 模型的公式分为 3 段。
(1) 当 0° ≤ H < 120° 时:
(2) 当 120° ≤ H < 240° 时:
(3) 当 240° ≤ H < 360° 时:
同态滤波
从图像的形成和光特性考虑,一幅图像是由光源的照度分量 i(x,y)
和目标物的反射分量 r(x,y)
组成的,其数学模型为:f(x,y) = i(x,y)·r(x,y)
,式中,r(x,y)
的性质取决于成像物体的表面特性。
一般来说,光照条件体现在照度分量 i(x,y)
中,i(x,y)
变化缓慢,其频谱主要落在低频区域;而 r(x,y)
反映图像的细节等特征,其频谱主要落在高频部分。为此,只要从 f(x,y)
中将i(x,y)
和 r(x,y)
分开,并分别采取压缩低频、提升高频的方法,就可以达到减弱照度分量、增强反射分量从而使图像清晰的目的 。
同态滤波的流程如图所示。
基本思路
在 HSI 颜色空间下,对 I 分量进行处理,裁剪成 相同大小的 n×n 图像块,进行同态滤波,以此实现局部增强,但拼接图像时,在边缘必然会存在颜色突变,造成块效应,因此需要解决这个副作用。将相邻的图像块分为水平和竖直两类,利用边界处左右两边的像素进行均值滤波,以此来消除块效应。增强后的 I 分量再重新与 S 和 H 分量组合并还原到 RGB 空间。
代码实现
同态滤波实现
对彩色图像进行同态滤波,首先需要将彩色图像从 RGB 颜色空间转换到 HSI 颜色空间,然后保持色调和饱和度分量不变,只对亮度分量进行同态滤波,最后再将处理后的图像从 HSI 空间转换到 RGB 颜色空间,得到增强后的彩色图像。
HomoMor.m
function im_e = HomoMor(im,Hh,Hl,D0,c)
% 高斯同态滤波器参数的设置
% Hh = 1.2; % 高频增益,需要大于1
% Hl = 0.5; % 低频增益,取值在0和1之间
% D0 = 4; % 截止频率,越大图像越亮
% c = 1; % 锐化系数
%% 滤波器初始化
im = double(im);
[row, col] = size(im);
% 确定傅里叶变换的原点
x0 = floor(row/2);
y0 = floor(col/2);
% 初始化
H = zeros(row,col);
for i = 1:row
for j = 1:col
D = (i-x0)^2 + (j-y0)^2;
if D == 0
H(i,j) = Hl;
else
H(i,j) = (Hh-Hl) * (1 - exp(-c*D^2/(D0^2))) + Hl; % 高斯同态滤波函数
end
end
end
%% 同态滤波
im_l = log(im + 0.000001); % 取对数变换
im_f = fftshift(fft2(im_l)); % 傅里叶变换,并移到中心位置
im_nf = H .* im_f; % 高斯滤波
im_n = real(ifft2(ifftshift(im_nf))); % 傅里叶反变换,恢复位置
im_e = exp(im_n - 0.000001); % 取指数变化
end
HSV 颜色空间下的全局同态滤波
GlobalHomo.m
function rgbim = GlobalHomo(I,Hh,Hl,D0,c)
%全局同态滤波
% rgbim = GlobalHomo(I,Hh,Hl,D0,c)
% I:输入图像
% Hh:高频增益,需要大于1
% Hl:低频增益,取值在0和1之间
% D0:截止频率,越大图像越亮
% c:锐化系数
hsiim = rgb2hsi(I);
im = hsiim(:,:,3);
im_g = HomoMor(im,Hh,Hl,D0,c);
hsiim(:,:,3) = im_g;
rgbim = hsi2rgb(hsiim);
end
不加块效应消除的分块同态滤波
BlockHomo.m
function rgbim = BlockHomo(I,Hh,Hl,D0,c,block)
% rgbim = GlobalHomo(I,Hh,Hl,D0,c)
% I:输入图像
% Hh:高频增益,需要大于1
% Hl:低频增益,取值在0和1之间
% D0:截止频率,越大图像越亮
% c:锐化系数
% block:分块大小
hsiim = rgb2hsi(I);
im = hsiim(:,:,3);
[row,col] = size(im);
% 块的大小为Mb*Nb
Mb = block; Nb = block;
rb = floor(row/Mb); cb = floor(col/Nb);
im_g = im;
for i =1:rb
for j = 1:cb
temp = im((i-1)*Mb+1:i*Mb , (j-1)*Nb+1:j*Nb);
im_g((i-1)*Mb+1:i*Mb , (j-1)*Nb+1:j*Nb) = HomoMor(temp,Hh,Hl,D0,c);
end
end
hsiim(:,:,3) = im_g;
rgbim = hsi2rgb(hsiim);
end
加去除块效应的分块同态滤波
BlockHomo.m
function rgbim = BlockHomo(I,Hh,Hl,D0,c,block)
%分块同态滤波
% rgbim = GlobalHomo(I,Hh,Hl,D0,c)
% I:输入图像
% Hh:高频增益,需要大于1
% Hl:低频增益,取值在0和1之间
% D0:截止频率,越大图像越亮
% c:锐化系数
% block:分块大小
hsiim = rgb2hsi(I);
im = hsiim(:,:,3);
[row,col] = size(im);
% 块的大小为Mb*Nb
Mb = block; Nb = block;
rb = floor(row/Mb); cb = floor(col/Nb);
im_g = im;
for i =1:rb
for j = 1:cb
temp = im((i-1)*Mb+1:i*Mb , (j-1)*Nb+1:j*Nb);
im_g((i-1)*Mb+1:i*Mb , (j-1)*Nb+1:j*Nb) = HomoMor(temp,Hh,Hl,D0,c);
end
end
% 分块同态滤波
M = 3; N = 3;
n0 = floor(N/2); m0 = floor(M/2);
Ide = im_g;
% 去除水平相邻子图像块效应
for i = 1:row
for j = Nb:Nb:col-Nb
temp1 = 0;
temp2 = 0;
for k = -n0:n0
temp1 = temp1 + im_g(i,j+k);
temp2 = temp2 + im_g(i,j+1+k);
end
Ide(i,j) = temp1/N;
Ide(i,j+1) = temp2/N;
end
end
% 去除垂直相邻子图像块效应
for i = Mb:Mb:row-Nb
for j = 1:col
temp1 = 0;
temp2 = 0;
for k = -m0:m0
temp1 = temp1 + im_g(i+k,j);
temp2 = temp2 + im_g(i+1+k,j);
end
Ide(i,j) = temp1/M;
Ide(i+1,j) = temp2/M;
end
end
hsiim(:,:,3) = Ide;
rgbim = hsi2rgb(hsiim);
end
局部平均信息熵
BlockAvEn.m
function en = BlockAvEn(I,block)
%局部平均信息熵
% en = BlockAvEn(I,block)
% I:输入图像
% block:分块大小
en = 0;
[row,col,channel] = size(I);
% 块的大小为Mb*Nb
Mb = block; Nb = block;
rb = floor(row/Mb); cb = floor(col/Nb);
for c = 1:channel
im = I(:,:,c);
for i =1:rb
for j = 1:cb
temp = im((i-1)*Mb+1:i*Mb , (j-1)*Nb+1:j*Nb);
en = en + entropy(temp);
end
end
end
en = en/(rb*cb*channel);
end
实验结果对比
fig.m
close all;clear;clc
addpath('model');
addpath('src');
% 读取图像
I = imread('4.1.01.tiff');
en = BlockAvEn(I,8);
% 全局同态滤波
rgbim0 = GlobalHomo(I,1.2,0.5,50,1);
en0 = BlockAvEn(rgbim0,8);
% 局部同态滤波
rgbim1 = LocalHomo(I,1.2,0.5,4,1,8);
en1 = BlockAvEn(rgbim1,8);
% 分块同态滤波
rgbim2 = BlockHomo(I,1.2,0.5,4,1,8);
en2 = BlockAvEn(rgbim2,8);
figure(1)
subplot(1,4,1)
imshow(I);
title(['原始图像:',num2str(en)])
subplot(1,4,2)
imshow(rgbim0);
title(['全局同态滤波:',num2str(en0)])
subplot(1,4,3)
imshow(rgbim1);
title(['局部同态滤波:',num2str(en1)])
subplot(1,4,4)
imshow(rgbim2);
title(['分块同态滤波:',num2str(en2)])
结果
图像 | 原文的局部平均信息熵 | 复现的局部平均信息熵 |
---|---|---|
原始图像 | 3.8476 | 3.8476 |
全局同态滤波 | 4.6636 | 4.6635 |
局部同态滤波 | 4.6848 | 4.6848 |
去除块效应的局部同态滤波 | 4.6740 | 4.6758 |
从实验结果可以看出,全局同态滤波在增强图像某部分像素时,导致另一部分像素过增强,从而造成图像细节的损失。而局部同态滤波考虑了图像的局部特征,增强之后的图像光照均匀,明暗适中,细节清晰,且经过块效应去除后,图像有更好的视觉效果。
基于HSI和局部同态滤波的彩色图像增强的更多相关文章
- ISP模块之彩色图像增强--ACE算法 .
ACE(Automatic Color Enhancement),自动色彩增强算法,是一种对于彩色图像增强十分行之有效的方法.它的改进算法以及快速实现在文章Automatic Color Enhanc ...
- 2014.04.28基于CPLD的LCOS场序彩色视频控制器设计
基于CPLD的LCOS场序彩色视频控制器设计 作者:宋丹娜,代永平,刘艳艳,商广辉 发表刊物:液晶与显示,2009 学习时间:2014.04.28 文章讲述了-- (和上一篇论文有些相似之处) 1. ...
- 基于RGB与HSI颜色模型的图像提取法
现实中我们要处理的往往是RGB彩色图像.对其主要通过HSI转换.分量色差等技术来提出目标. RGB分量灰度化: RGB可以分为R.G.B三分量.当R=G=B即为灰度图像,很多时候为了方便,会直接利用某 ...
- Retinex图像增强算法
前一段时间研究了一下图像增强算法,发现Retinex理论在彩色图像增强.图像去雾.彩色图像恢复方面拥有很好的效果,下面介绍一下我对该算法的理解. Retinex理论 Retinex理论始于Land和M ...
- 基于MST的立体匹配及相关改进(A Non-Local Cost Aggregation Method for Stereo Matching)
怀着很纠结的心情来总结这篇论文,这主要是因为作者提虽然供了源代码,但是我并没有仔细去深究他的code,只是把他的算法加进了自己的项目.希望以后有时间能把MST这一结构自己编程实现!! 论文题目是基于非 ...
- Unity3D 基于预设(Prefab)的泛型对象池实现
背景 在研究Inventory Pro插件的时候,发现老外实现的一个泛型对象池,觉得设计的小巧实用,不敢私藏,特此共享出来. 以前也看过很多博友关于对象池的总结分享,但是世界这么大,这么复杂到底什么样 ...
- 基于图的异常检测(三):GraphRAD
基于图的异常检测(三):GraphRAD 风浪 一个快乐的数据玩家/风控/图挖掘 24 人赞同了该文章 论文:<GraphRAD: A Graph-based Risky Account Det ...
- CVPR2020:端到端学习三维点云的局部多视图描述符
CVPR2020:端到端学习三维点云的局部多视图描述符 End-to-End Learning Local Multi-View Descriptors for 3D Point Clouds 论文地 ...
- [笔记]dynamic gamma correction
2014-03-17 14:37:04 周一 在设计过程中参考论文<一种改进的视频画质增强算法及VLSI设计>电子学报 在YUV色彩空间对输入图像的信息进行判断分类和对比度调整,然后对调 ...
随机推荐
- [bug] Springboot JPA使用Sort排序时的问题
参考 https://blog.csdn.net/qq_44039966/article/details/102713779
- [刷题] 219 Contains Duplicate II
要求 给出整型数组nums和整数k,是否存在索引i和j,nums[i]==nums[j],且i和j之间的差不超过k 思路 暴力解法(n2) 建立最长为k+1的滑动窗口,用set查找窗口中是否有重复元素 ...
- Markdown 使用文档
MarkDown 简介 Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的语法十分 ...
- Boa Web Server 缺陷报告及其修正方法
综述 Boa 作为一种轻巧实用的 WEB 服务器广泛应用于嵌入式设备上, 但 Boa 对实现动态网页的 CGI 的支持上仍存在一些缺陷, 本文描述了 Boa 对 CGI 的 Status/Locat ...
- Nginx下配置Https 配置文件(vue)
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #erro ...
- Java基础语法,常用知识复习
1.开发环境搭建 1.1JDK.JRE.JVM.的关系 JDK = JRE + 开发工具集(例如javac编译工具集等) JRE = JVM + Java SE 标准类库 2.基本语法 2.1.jav ...
- Splunk 8.2.0 发布 (macOS, Linux, Windows)
强烈鄙视 CSDN 用户 CIAS(账号:hanzheng260561728),盗用本站资源,删除原文链接,并且用于收费下载!!! 请访问原文链接:https://sysin.org/article/ ...
- Docker学习(5) 在docker中部署静态网站
在容器中部署静态网站 设置容器的端口映射 在容器中部署静态网站 - Nginx部署流程 1 创建映射80端口的交互式容器 2 安装Nginx 3 安装文本编辑器vim 4 创建静态页面 5 修改N ...
- Go语言网络通信---连续通信的UDP编程
Server: package main import ( "fmt" "net" ) func main() { //创建udp地址 udpAddr, _ : ...
- 安装Keras出现的问题
先是pip install tensorflow 给装好了,但是pip install keras出现如下的问题: 只好搜帖子,参考如下的帖子,我直接 conda install keras wi ...