基于直方图的图像增强算法(HE、CLAHE、Retinex)之(一)

直方图是图像色彩统计特征的抽象表述。基于直方图可以实现很多有趣的算法。例如,图像增强中利用直方图来调整图像的对比度、有人利用直方图来进行大规模无损数据隐藏、还有人利用梯度直方图HOG来构建图像特征进而实现目标检测。本节我们就来讨论重要的直方图均衡化算法,说它重要是因为以此为基础后续又衍生出了许多实用而有趣的算法。

Histogram equalization

如果一幅图像的像素灰度值在一个过于有限的范围内聚集,那么图像的程序效果即会很糟糕,直接观感就是对比度很弱。下图来自维基百科,第一幅图的直方图分布非常不均衡。如果把直方图均匀地延展到整个分布域内,则图像的效果显得好了很多。

Matlab中提供了现成的函数“histeq()”来实现图像的直方图均衡。但为了演示说明算法的原理,下面我将在Matlab中自行编码实现图像的直方图均衡。通过代码来演示这个算法显然更加直观,更加易懂。当然,其实我还不得不感叹,如果仅仅是作为图像算法研究之用,Matlab确实非常好用。

首先读入图像,并将其转化为灰度图。然后提取图像的长和宽。

image = imread(‘Unequalized_Hawkes_Bay_NZ.jpg‘);
Img = rgb2gray(image);
[height,width]=size(image);

然后绘制一下原始图像的直方图。

[counts1, x] = imhist(Img,256);
counts2 = counts1/height/width;
stem(x, counts2);

统计每个灰度的像素值累计数目。

NumPixel = zeros(1,256);%统计各灰度数目,共256个灰度级
for i = 1:height
	for j = 1: width
	%对应灰度值像素点数量增加一
	%因为NumPixel的下标是从1开始,但是图像像素的取值范围是0~255,所以用NumPixel(Img(i,j) + 1)
	NumPixel(Img(i,j) + 1) = NumPixel(Img(i,j) + 1) + 1;
	end
end

然后将频数值算为频率

ProbPixel = zeros(1,256);
for i = 1:256
	ProbPixel(i) = NumPixel(i) / (height * width * 1.0);
end

再用函数cumsum来计算cdf,并将频率(取值范围是0.0~1.0)映射到0~255的无符号整数。

CumuPixel = cumsum(ProbPixel);
CumuPixel = uint8(255 .* CumuPixel + 0.5);

直方图均衡。赋值语句右端,Img(i,j)被用来作为CumuPixel的索引。比如Img(i,j) = 120,则从CumuPixel中取出第120个值作为Img(i,j) 的新像素值。

for i = 1:height
	for j = 1: width
		Img(i,j) = CumuPixel(Img(i,j));
	end
end

最后显示新图像的直方图。

imshow(Img);
[counts1, x] = imhist(Img,256);
counts2 = counts1/height/width;
stem(x, counts2);

当然,上述讨论的是灰度图像的直方图均衡。对于彩色图像而言,你可能会想到分别对R、G、B三个分量来做处理,这也确实是一种方法。但有些时候,这样做很有可能导致结果图像色彩失真。因此有人建议将RGB空间转换为HSV之后,对V分量进行直方图均衡处理以保存图像色彩不失真。下面我们来做一些对比实验。待处理图像是标准的图像处理测试用图couple图,如下所示。

首先,我们分别处理R、G、B三个分量,为了简便我们直接使用matlab中的函数histeq()。

a = imread(‘couple.tiff‘);
R = a(:,:,1);
G = a(:,:,2);
B = a(:,:,3);

R = histeq(R, 256);
G = histeq(G, 256);
B = histeq(B, 256);

a(:,:,1) = R;
a(:,:,2) = G;
a(:,:,3) = B;
imshow(a)

下面的代码使用了另外一种方式,即将色彩空间转换到HSV后,对V通道进行处理。由于代码基本与前面介绍的一致,这里我们不再做过多解释了。

Img = imread(‘couple.tiff‘);
hsvImg = rgb2hsv(Img);
V=hsvImg(:,:,3);
[height,width]=size(V);

V = uint8(V*255);
NumPixel = zeros(1,256);
for i = 1:height
	for j = 1: width
	NumPixel(V(i,j) + 1) = NumPixel(V(i,j) + 1) + 1;
	end
end

ProbPixel = zeros(1,256);
for i = 1:256
	ProbPixel(i) = NumPixel(i) / (height * width * 1.0);
end

CumuPixel = cumsum(ProbPixel);
CumuPixel = uint8(255 .* CumuPixel + 0.5);

for i = 1:height
	for j = 1: width
		V(i,j) = CumuPixel(V(i,j));
	end
end

V = im2double(V);
hsvImg(:,:,3) = V;
outputImg = hsv2rgb(hsvImg);
imshow(outputImg);

最后,来对比一下不同方法对彩色图像的处理效果。下面的左图是采用R、G、B三分量分别处理得到的结果。右图是对HSV空间下V通道处理之结果。显然,右图的效果更理想,而左图则出现了一定的色彩失真。事实上,对彩色图像进行直方图均衡是图像处理研究领域一个看似简单,但是一直有人在研究的话题。我们所说的对HSV空间中V分量进行处理的方法也是比较基本的策略。很多相关的研究文章都提出了更进一步的、适应性更强的彩色图像直方图均衡化算法。有兴趣的读者可以参阅相关文献以了解更多。

分别处理R、G、B三个分量之结果                                            转换到HSV空间后处理V分量

这是本系列文章的第一篇,在下一篇文章中我们将要讨论CLAHE算法,也就是限制对比度的自适应直方图均衡算法。

如果你是图像处理的同道中人,欢迎加入图像处理学习群(529549320)。

更多有趣有用的图像处理算法还可以参考我的《数字图像处理原理与实践(Matlab版)》

时间: 2024-11-04 15:47:49

基于直方图的图像增强算法(HE、CLAHE、Retinex)之(一)的相关文章

基于直方图的图像增强算法(HE、CLAHE、Retinex)之(二)

作为图像增强算法系列的第二篇文章,下面我们将要介绍功能强大.用途广泛.影响深远的对比度有限的自适应直方图均衡(CLAHE,Contrast Limited Adaptive Histogram Equalization)算法.尽管最初它仅仅是被当作一种图像增强算法被提出,但是现今在图像去雾.低照度图像增强,水下图像效果调节.以及数码照片改善等方面都有应用.这个算法的算法原理看似简单,但是实现起来却并不那么容易.我们将结合相应的Matlab代码来对其进行解释.希望你在阅读本文之前对朴素的直方图均衡

retinex图像增强算法的研究

图像增强方面我共研究了Retinex.暗通道去雾.ACE等算法.其实,它们都是共通的.甚至可以说,Retinex和暗通道去雾就是同一个算法的两个不同视角,而ACE算法又是将Retinex和灰度世界等白平衡理论相结合的产物.下面将依次讨论,每个算法写一个心得,欢迎拍砖. 今天先写Retinex.Retinex理论认为,人眼观测到的图像S是光照图像L和物体反射图像R的乘积.而R才是真实的恒常性的图像,但是怎么从观测图像S中计算R呢?这是个病态问题,根本不可解.研究者就通过加以一定的约束条件,比如光照

十三种基于直方图的图像全局二值化算法原理、实现、代码及效果(转)

十三种基于直方图的图像全局二值化算法原理.实现.代码及效果(转) http://www.cnblogs.com/carekee/articles/3643394.html 图像二值化的目的是最大限度的将图象中感兴趣的部分保留下来,在很多情况下,也是进行图像分析.特征提取与模式识别之前的必要的图像预处理过程.这个看似简单的问题,在过去的四十年里受到国内外学者的广泛关注,产生了数以百计的阈值选取方法,但如同其他图像分割算法一样,没有一个现有方法对各种各样的图像都能得到令人满意的结果. 在这些庞大的分

基于直方图的图像二值化算法实现

引言 图像二值化的目的是最大限度的将图象中感兴趣的部分保留下来,在很多情况下,也是进行图像分析.特征提取与模式识别之前的必要的图像预处理过程.在过去年里受到国内外学者的广泛关注,产生了数以百计的阈值选取方法,但如同其他图像分割算法一样,没有一个现有方法对各种各样的图像都能得到令人满意的结果. 在分类方法中,基于直方图的全局二值算法都从不同的科学层次提出了各自的实施方案,并且这类方法都有着一些共同的特点:简单.算法容易实现和执行速度快. 算法代码 第一种方法Huang L.-K et al.参考代

关于Retinex图像增强算法的一些新学习。

最近再次看了一下IPOL网站,有一篇最近发表的文章,名字就是Multiscale Retinex,感觉自己对这个已经基本了解了,但还是进去看了看,也有一些收获,于是抽空把他们稍微整理了下,原始文章及其配套代码详见:http://www.ipol.im/pub/art/2014/107/. 之前在我的 带色彩恢复的多尺度视网膜增强算法(MSRCR)的原理.实现及应用 一文中已经较为详细的描述了Multiscale Retinex的基本原理和应用,这里就不再做过多的说明.为表述方便,还是贴出其基本的

ArcGIS水分分析工具的流向分析是基于D8单流向算法

ArcGIS水分分析工具的流向分析是基于D8单流向算法,如果分析使用的DEM存在凹陷点,就会产生汇,导致径流断流从而影响了分析结果.在前面章节<ArcGIS水文分析实战教程(2)ArcGIS水文分析工具的基本原理>中又介绍过D8算法,而<ArcGIS水文分析实战教程(4)地形预处理>章节中笔者也较少过如何创建无凹陷点得DEM数据,在使用流向分析工具之前可以先行阅读. 首先流向分析要使用填洼过的数据,确保DEM数据没有凹陷点.如果数据准备妥当,直接使用水文分析工具箱中的[流向]工具进

在Hadoop上运行基于RMM中文分词算法的MapReduce程序

原文:http://xiaoxia.org/2011/12/18/map-reduce-program-of-rmm-word-count-on-hadoop/ 在Hadoop上运行基于RMM中文分词算法的MapReduce程序 23条回复 我知道这个文章标题很“学术”化,很俗,让人看起来是一篇很牛B或者很装逼的论文!其实不然,只是一份普通的实验报告,同时本文也不对RMM中文分词算法进行研究.这个实验报告是我做高性能计算课程的实验里提交的.所以,下面的内容是从我的实验报告里摘录出来的,当作是我学

一个简单的基于内容的推荐算法

最近闲下来又开始继续折腾推荐系统了,声明一下,本文只是介绍一下最基础的基于内容的推荐系统(Content-based recommender system)的工作原理,其实基于内容的推荐系统也分三六九等Orz,这里只是简单的较少一下最原始的.最基本的工作流程. 基于内容的推荐算法思路很简单,它的原理大概分为3步: 1.为每个物品(Item)构建一个物品的属性资料(Item Profile) 2.为每个用户(User)构建一个用户的喜好资料(User Profile) 3.计算用户喜好资料与物品属

由Photoshop高反差保留算法原理联想到的一些图像增强算法。

原地址:http://blog.csdn.net/laviewpbt/article/details/20577683 关于高反差保留的用处说明呢,从百度里复制了一段文字,我觉得写得蛮好的: 高反差保留就是保留图像的高反差部分,再说得真白些,就是保留图像上像素与周围反差比较大的部分,其它的部分都变为灰色.拿一个人物照片来举例,反差比较大的部分有人的眼睛,嘴,以及身体轮廓.如果执行了就反差保留,这些信息将留下来(与灰色形成鲜明对比).它的主要作用就是加强图像中高反差部分.还以人物照片为例子,一般为