PhotoShop算法实现--色彩均衡化(十一)
彩色均衡化(Equalizer)就是要增大亮度间隔,使其呈均匀化分布,减少反差,从而修正图像中的某些不足的地方,使图像细节变得清晰。
实现原理:图像均衡化的基本思想就是将出现频率较小的亮度级并入到邻近的亮度级中,从而拉开亮度间隔,较少亮度等级,使其呈均匀分布,弱化其反差。实现方法:对图像进行直方图信息统计,再根据均衡化的基本思想对个亮度级的分布概率做均衡化处理,产生一个256级亮度的映射表,最后对图像进行亮度映射处理。
实现代码:
void PhotoShop::Equalizer(Mat& img, Mat& gImg)
{
if ( gImg.empty())
gImg.create(img.rows, img.cols, CV_8UC1);
int i, j;
Size size = img.size();
float total = size.width* size.height;
int Count[256] = {0}; //统计
float Probability[256]={0}; // 概率
float fSum[256] ={0}; // 概率累加
uchar level[256]={0}; // 重新分布灰度
if (img.isContinuous() && gImg.isContinuous())
{
size.width *= size.height;
size.height = 1;
}
for ( i= 0; i<size.height; ++i)
{
const unsigned char* src = (const unsigned char*)img.data+ img.step*i;
for ( j=0; j<size.width; ++j)
{
Count[src[j]]++;
}
}
for ( i=0; i<256; i++)
{
Probability[i] = Count[i]/total;
if ( i ==0)
fSum[0] = Probability[0];
else
fSum[i] = fSum[i-1]+Probability[i];
level[i] = saturate_cast<uchar>(255*fSum[i]+0.5);
}
for ( i= 0; i<size.height; ++i)
{
const unsigned char* src = (const unsigned char*)img.data+ img.step*i;
unsigned char* dst = (unsigned char*)gImg.data +gImg.step*i;
for ( j=0; j<size.width; ++j)
{
dst[j] = level[src[j]];
}
}
实现效果:
经过直方图处理的图像不一定效果比原图好,进行直方图均衡存在如下两个缺点:
(1)变换后图像的亮度级减少,某些细节信息丢失。
(2)某些图像经过处理后对比度过分被增强。
为此,M.Kamel等人从图像相邻像素相关这一事实出发,将亮度概率分布和空间分布联系在一起,提出了用二维条件概率密度函数取代一维概率密度函数作为均衡化的条件,很好地解决了这个问题,感兴趣的朋友可以查阅相关资料。
作者:kezunhai 出处:http://blog.csdn.net/kezunhai 欢迎转载或分享,但请务必声明文章出处。