简介

在图像采集过程中,由于光照环境或物体表面反光等原因会造成图像光照不均 。图像的光照不均会直接影响图像分析的结果。因此,对光照不均图像进行增强,消除光照的影响是光照不均图像处理中不可缺少的环节 。同态滤波是光照不均图像增强常用的方法。同态滤波增强是从图像的整体角度对光照不均进行修正,虽然可以很好地保持图像的原始面貌,但它没有充分考虑图像的空间局部特性,在增强图像某部分像素时,易导致另一部分像素过增强 。因此,局部同态滤波算法对图像的各个子图像分别进行同态滤波,并对局部同态滤波产生的块效应采用相邻子图像边界平均的方法进行去除。

项目源码地址: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和局部同态滤波的彩色图像增强的更多相关文章

  1. ISP模块之彩色图像增强--ACE算法 .

    ACE(Automatic Color Enhancement),自动色彩增强算法,是一种对于彩色图像增强十分行之有效的方法.它的改进算法以及快速实现在文章Automatic Color Enhanc ...

  2. 2014.04.28基于CPLD的LCOS场序彩色视频控制器设计

    基于CPLD的LCOS场序彩色视频控制器设计 作者:宋丹娜,代永平,刘艳艳,商广辉 发表刊物:液晶与显示,2009 学习时间:2014.04.28 文章讲述了-- (和上一篇论文有些相似之处) 1. ...

  3. 基于RGB与HSI颜色模型的图像提取法

    现实中我们要处理的往往是RGB彩色图像.对其主要通过HSI转换.分量色差等技术来提出目标. RGB分量灰度化: RGB可以分为R.G.B三分量.当R=G=B即为灰度图像,很多时候为了方便,会直接利用某 ...

  4. Retinex图像增强算法

    前一段时间研究了一下图像增强算法,发现Retinex理论在彩色图像增强.图像去雾.彩色图像恢复方面拥有很好的效果,下面介绍一下我对该算法的理解. Retinex理论 Retinex理论始于Land和M ...

  5. 基于MST的立体匹配及相关改进(A Non-Local Cost Aggregation Method for Stereo Matching)

    怀着很纠结的心情来总结这篇论文,这主要是因为作者提虽然供了源代码,但是我并没有仔细去深究他的code,只是把他的算法加进了自己的项目.希望以后有时间能把MST这一结构自己编程实现!! 论文题目是基于非 ...

  6. Unity3D 基于预设(Prefab)的泛型对象池实现

    背景 在研究Inventory Pro插件的时候,发现老外实现的一个泛型对象池,觉得设计的小巧实用,不敢私藏,特此共享出来. 以前也看过很多博友关于对象池的总结分享,但是世界这么大,这么复杂到底什么样 ...

  7. 基于图的异常检测(三):GraphRAD

    基于图的异常检测(三):GraphRAD 风浪 一个快乐的数据玩家/风控/图挖掘 24 人赞同了该文章 论文:<GraphRAD: A Graph-based Risky Account Det ...

  8. CVPR2020:端到端学习三维点云的局部多视图描述符

    CVPR2020:端到端学习三维点云的局部多视图描述符 End-to-End Learning Local Multi-View Descriptors for 3D Point Clouds 论文地 ...

  9. [笔记]dynamic gamma correction

    2014-03-17  14:37:04 周一 在设计过程中参考论文<一种改进的视频画质增强算法及VLSI设计>电子学报 在YUV色彩空间对输入图像的信息进行判断分类和对比度调整,然后对调 ...

随机推荐

  1. [Linux] Linux命令行与Shell脚本编程大全 Part.2

    进程 Linux是多用户系统,多个用户可以在不同地方通过网络连接到一个Linux系统上进行操作 w:显示登录人员信息 date:显示当前日期.时间和时区 up:从开机登录到现在经过的时间 load a ...

  2. 如何用WINPE备份电脑系统;电脑备份 听语音

    如何用WINPE备份电脑系统:电脑备份 听语音 原创 | 浏览:1046 | 更新:2017-09-30 15:09 1 2 3 4 5 6 7 分步阅读 备份系统已经成为一种常态,我们在安装完成系统 ...

  3. debian配置---->/etc/apt/sources.list apt基本源设置指南

    yum或apt基本源设置指南   关于: 管理Linux服务器的运维或开发人员经常需要安装软件,最常用方式应该是通过Linux系统提供的包管理工具来在线安装,比如centos的yum,ubuntu或d ...

  4. nvm、nrm、npm 安装和使用详解

    一.nvm的安装和使用   nvm全称Node Version Manager是 Nodejs 版本管理器,它让我们能方便的对 Nodejs 的版 本进行切换. nvm 的官方版本只支持 Linux ...

  5. shell应用之简单计算器

    1 #!/bin/bash 2 while : 3 do 4 read -p "请输入计算规则:" JS 5 if [ -z $JS ];then 6 exit 7 else 8 ...

  6. KEIL下目标程序配置生成BIN文件

    圈中地址:E:\Program Files\keil4arm\ARM\ARMCC\bin\fromelf.exe --bin -o ..\OBJBIN\LY2030.BIN ..\obj\LY2052 ...

  7. 1.4linux文件和目录常用命令

    文件和目录常用命令 目标 查看目录内容 ls 切换目录 cd 创建和删除操作 touch rm mkdir 拷贝和移动文件 cp mv 查看文件内容 cat more grep 其他 echo 重定向 ...

  8. Devops 导论

    第一章 DevOps概述 第二章 个体软件过程 第三章 敏捷软件开发 第四章 软件架构演化 第五章 云原生与容器技术 第六章 XaaS和IT服务标准 第七章 DevOps工具链 --学习总结自< ...

  9. python 中 list 的append与extend区别

    append 添加的是一个对象 extend 添加的是序列与原序列合并

  10. MindSpore激活函数总结与测试

    技术背景 激活函数在机器学习的前向网络中担任着非常重要的角色,我们可以认为它是一个决策函数.举个例子说,我们要判断一个输出的数据是猫还是狗,我们所得到的数据是0.01,而我们预设的数据中0代表猫1代表 ...