前言 接触和了解Color Constancy主要是通过 Marc Ebner 的一本专著“ Color Constancy ”。这篇文章主要讲色彩恒常性中一个最基本的算法——Gray World 算法和White Patch Retinex算法。在讲述算法之前,先回答两个问题。
(1)什么是色彩恒常性?what is Color Constancy?
首先,颜色并不是一个实实在在的东西,它只是我们大脑和视网膜处理的结果。我们的视觉系统有一个特殊的功能就是在光源变化的情况下,依然能够确定物体的真实颜色,这种鲁棒性是计算机等处理机器所不具有的。色彩的恒常性,也就可以简单的理解为,在外界光源变化的情况下,依然能够保留物体原始的色彩。我们研究色彩恒常性,提出各种算法,目的就是让计算机也具有人类视觉系统的这个特殊功能,在不同光源的照射下还原图像的本来颜色。White Patch Retinex算法就是其中的一个最简单的算法。在后面的实验结果中,我们也可以看出,由于黄色光照下而整体颜色偏黄的餐桌,经过White Patch Retinex算法处理后,桌布恢复了白色。
(2)retinex是什么意思?what is retinex?
retinex 是来自于中古拉丁文Retina 和拉丁文Cortic两个单词的组合, 发音[re-tin-ex] 或 ['ret-nex] 。由Edwin Land 在他的人类色彩视觉模型中提出,是结合眼睛的视网膜(retina)和大脑的头皮层(cortex)而创新出来的一个词。在图像处理中,这个词可以更加明确的定义为一个自动将视觉现实转换到图像的过程,让图像象你实际看见的世界一样的明亮、清晰和清楚。
(原文:from Medieval Latin retina and Latin cortic. Edwin Land coined word for his model of human color vision, combining the retina of the eye and the cerebral cortex of the brain. More specifically defined in image processing as a process that automatically provides visual realism to images.) 来自:Retinex Image processing NASA Langley Research Center
灰度世界算法(Gray World Algorithm)
人的视觉系统具有颜色恒常性,能从变化的光照环境和成像条件下获取物体表面颜色的不变特性,但成像设备不具有这样的调节功能,
不同的光照环境会导致采集的图像颜色与真实颜色存在一定程度的偏差,需要选择合适的颜色平衡(校正)算法,消除光照环境对颜
色显现的影响。灰度世界算法是最常用平衡算法。
一、灰度世界算法 灰度世界算法以灰度世界假设为基础,该假设认为:对于一幅有着大量色彩变化的图像,
文章图片
, 三个分量的平均值趋于同一灰度值
文章图片
。 从物理意义上讲,灰色世界法假设自然界景物对于光线的平均反射的均值在总体上是个定值,这个定值近似地为“灰色”。 颜色平衡算法将这一假设强制应用于待处理图像,可以从图像中消除环境光的影响,获得原始场景图像。
【灰度世界算法(Gray World Algorithm)和White Patch Retinex算法】 算法执行步骤:
(1)一般有两种方法确定
文章图片
:
要么取固定值(如最亮灰度值的一半,八位显示的话即为128);
要么通过计算图像
文章图片
三通道平均值
文章图片
,取 ;
(2)计算
文章图片
三个通道的增益系数:
文章图片
;
文章图片
;
文章图片
;
(3)根据Von Kries对角模型,对于图像中的每个像素
文章图片
,调整其分量
文章图片
分量:
文章图片
这种算法简单快速,但是当图像场景颜色并不丰富时,尤其出现大块单色物体时,该算法常会失效。
注 :Von Kries提出,可用一个对角矩阵变换描述两种光照条件下同一物体表面颜色间的关系。假定在光照
文章图片
下感知
到的物体
文章图片
值分别为
文章图片
、
文章图片
, 根据Von Kries对角理论有:
文章图片
该理论实现不同光源间的转换。
二、Matlab实现
I=imread('N.jpg');
y=GrayWorld(I);
figure(1);
imshow(I);
figure(2);
imshow(y);
function y=GrayWorld(Image)
r=Image(:,:,1);
g=Image(:,:,2);
b=Image(:,:,3);
avgR = mean(mean(r));
avgG = mean(mean(g));
avgB = mean(mean(b));
avgRGB = [avgR avgG avgB];
grayValue = https://www.it610.com/article/(avgR + avgG + avgB)/3
scaleValue = grayValue./avgRGB;
newI(:,:,1) = scaleValue(1) * r;
newI(:,:,2) = scaleValue(2) * g;
newI(:,:,3) = scaleValue(3) * b;
y=newI;
三、具体数学推导过程。
算法:
(0)图像成像模型
White Patch Retinex算法的目的是恢复图像的本身色彩,这势必就要估计图像中外界光源的强度。下面是图像成像的数学表达式:
文章图片
(1)
式中,
文章图片
是图像成像的几何尺寸因子,
文章图片
是物体在
文章图片
位置处对波长
文章图片
的光的反射系数(反射系数的大小,直接决定成像的亮度),
文章图片
是光源的强度,
文章图片
是照相机的感光系数。最终的成像为
文章图片
,其中
文章图片
与
文章图片
是相互对应的关系,前者是图像中的位置,后者是实际物体的位置。
一般RGB照相机的感光材料仅对r,g,b三个颜色反应,即
文章图片
由三个窄带波长组成。假设
文章图片
是delta函数,那么(1)式可以简化为:
文章图片
(2)
图像成像模型到此结束。我们接下来的任务就是估计光源强度
文章图片
。
(1)基本算法
下式是图像成像的数学表达
文章图片
依然假设像素的色彩和像素的亮度值成比例
文章图片
。
按照Gray World假设,对
文章图片
取平均,则有
文章图片
且
文章图片
式中E(R) = 1/2即是由Gray World假设得出,带入后得到:
文章图片
依然假设E(G)=1,那么光源的强度可以估计为:
文章图片
(1)
最终经过色彩恢复后的图像为:
文章图片
(2)
(2)改进算法
上述的原始算法具有很大的局限性。若图像的颜色比较单一,那么就不再满足gray world假设。为解决这个问题,提出了一些改进的算法,其中的一种主要思路是,先对图像进行分割,然后求分割后每块图像的颜色均值,进而求出总的颜色均值。用数学可以表示为下式:
文章图片
式中,nr为分割后区域的个数,a(Rj)为第j个区域的平均像素值。通过这种方法求得最终的ai带入式(1)中。
在这种思想下,提出了一种具体的算法,该算法求三个通道的直方图,然后将其量化为10类,那么最终可以将256*256*256中颜色量化为10*10*10=1000种颜色,书中将这1000种类描述为1000 buckets。(直观的理解就是把整幅图像画一个直方图,该直方图有1000个柱,也就是1000个bucket)。
最终的求ai的式子为:
文章图片
式中,nnz为直方图中像素点个数非0的bucket的个数,nb为bucket的总个数(按照书中的意思,nb =1000,我的理解是nb = nnz),ci(j)为第j个bucket中像素的值。
同样的,将求得的ai带入式(1)中,然后带入式(2)求得恢复后的输出。
White Patch Retinex
|
算法:
(1)图像成像模型
如上所示。
(2)最原始的White Patch Retinex算法
White Patch Retinex算法的主要思想是:if there is a white patch in the scene, then this patch reflects the maximum light possible for each band.This will be the color of the illuminant.举例说明,如果
文章图片
那么,
文章图片
如果像素的颜色和成像的I成正比,即
文章图片
,那么
文章图片
。
根据White Patch Retinex算法的主要思想,寻找图像中最亮的点,那么有:
文章图片
,求得的
文章图片
被作为光源的强度。
恢复后的图像为:
文章图片
。
使用该算法恢复的图像如实验中(1)的结果所示。可以看出,该算法能去掉一部分的光源颜色,但是效果不是很好。接下来将讲述一种改进后的算法,改进后的算法在实验结果和鲁棒性上均有所提高。
(3)改进后的White Patch Retinex算法
改进后的方法不在单纯的使用最亮点来估计光源强度,而是求原始图像每个通道的累计直方图,取累计到某一个值 p*n 时对应的图像像素值作为
文章图片
。其中p为百分值,实验中取为1%-5%,n为图像的像素点数。
具体可用下列式子表示:
文章图片
其中所求像素值jc应满足下列限制条件:
文章图片
式(5)中的Hc为各个通道的直方图,k为灰度级,根据上述理论就可以求得环境光A。
MATLAB代码:
代码(其中,para=0是原始的方法,para=1是改进后的方法):
[plain]view plain copy print ?
- function out = WhitePatchRetinex(in,para)
- %%%% copyright: ofalling %%%%
- if( nargin < 2 )
- para = 0;
- end
- out = zeros(size(in));
- inDouble = double(in);
- L = [0 0 0];
- if ( para == 0 )
- for i = 1:3
- L(i) = max(max(in(:,:,i)));
- out(:,:,i) = inDouble(:,:,i)/L(i);
- end
- elseif ( para == 1 )% more robust algorithm
- np = 0.1 * size(in,1)*size(in,2);
- for i = 1:3
- H = imhist(in(:,:,i));
- j = 256;
- sum = 0;
- while( (sum < np)&(j > 1) )
- j = j-1;
- sum = sum + H(j);
- end
- L(i) = j;
- out(:,:,i) = inDouble(:,:,i)/L(i);
- end
- end
Marc Ebner 的主页: http://www.ra.cs.uni-tuebingen.de/mitarb/ebner/welcome.html 书籍:Marc Ebner. “ Color Constancy ”.Wiley 1st edition. 2007.http://www.ra.cs.uni-tuebingen.de/mitarb/ebner/ColorConstancyBook.html 论文:A Parallel Algorithm for Color Constancy . http://www.ra.cs.uni-tuebingen.de/mitarb/ebner/research/colorConstancy/colorConstancy.html 有关Color Constancy 的网站: http://colorconstancy.com/
推荐阅读
- opencv|图像处理之椒盐噪声的添加与去除
- OpenCV|【OpenCV 完整例程】89. 带阻滤波器的传递函数
- OpenCV|【OpenCV 完整例程】90. 频率域陷波滤波器
- OpenCV|【OpenCV 完整例程】22. 图像添加非中文文字
- OpenCV|【OpenCV 完整例程】91. 高斯噪声、瑞利噪声、爱尔兰噪声
- 安卓开发|通过RenderScript 实现 NV21转Bitmap、两张Bitmap按照透明度混合的工具类
- 基于SLIC的细胞分割与检测
- 科学计算|超像素分割
- MFC|gdal 图像金字塔