使用C++实现彩色图像直方图均衡化的三种方法

引言本文主要介绍如何实现彩色图像的直方图均衡化,达到图像增强效果的三种方法:1. 对RGB三个通道图像分别进行直方图均衡化,然后再合并三个通道;2. 提取RGB三个通道图像,计算其平均直方图结果,然后再进行均衡化;3. RGB空间转为HSI空间图像,对I(亮度,Intensity)通道进行直方图均衡化,再转为RGB图像。第一种方法不推荐,会破坏色彩结构;根据情况选择第2,3种方...
摘要由CSDN通过智能技术生成

引言

本文主要介绍如何实现彩色图像的直方图均衡化,达到图像增强效果的三种方法:

1. 对RGB三个通道图像分别进行直方图均衡化,然后再合并三个通道;

2. 提取RGB三个通道图像,计算其平均直方图结果,然后再进行均衡化;

3. RGB空间转为HSI空间图像,对I(亮度,Intensity)通道进行直方图均衡化,再转为RGB图像。

第一种方法不推荐,会破坏色彩结构;根据情况选择第2,3种方法。

 

先导知识

直方图

首先必须了解灰度直方图是什么东西。直方图就是统计一个图像各灰度级值0~255有多少各像素点。

 

单通道均衡化

在实现之前先了解单通道图像(灰度图)直方图均衡化和其过程。

上述过程就是求出一个原像素点到均衡化的像素点的一个映射函数 f(x)。利用该映射函数就可以循环扫描图像的每一个像素x,然后得到f(x)替代原来的像素值x,达到均衡化的结果。

在实际均衡化过程中,核心步骤如下:
1. 传入单通道图像和该的灰度直方图。
2. 遍历灰度直方图,对值 I 从 0~255 累计求和,对累计求和,对和结果除以图像的素数,然后乘以 L-1得到函数结果 得到函数结果 f(xi )。
3. 将每一个灰度值 i累积求和的结果 累积求和的结果 f(xi )存储在一个大小为 256 的 int 数组中,存储的位置为 i;
4. 遍历输入图像每一个素,记点值为 x,修改其像素值使等于 f(x)。
5. 均衡化结束。

 

算法实现

单通道均衡化

主要步骤如下,EqualizedResult就是均衡化的映射函数,下一步骤就是将像素点值作为映射函数的输入,将输出结果替代原来的像素值。


// 功能:对灰度直方图进行均衡化
// 输入:单通道CImg对象, 灰度图对象
// 输出:均衡化结果
CImg<unsigned int> HistogramEqualization::HistogramEqualizationMethod
(CImg<unsigned int> InputImage,CImg<unsigned int>  Histogram)
{
	int L = 256; //灰度级
	int NumOfPixels = (InputImage)._width * (InputImage)._height;

	double CumulativeDistributionFunction[256] = { 0 }; // 灰度直方图的累积分布
	double EqualizedResult[256] = { 0 };               //  均衡化结果映射函数
	/*直方图就对应于概率密度函数pdf,
	而概率分布函数cdf就是直方图的累积和,
	即概率密度函数的积分
	积分*(L(=255)-1)*/
	
	/*均衡化关键步骤*/
	int count = 0;
	cimg_forX(Histogram, x) {
		count += Histogram[x];  // 累计求和
		CumulativeDistributionFunction[x] = 1.0 * count / NumOfPixels;  //计算概率
		EqualizedResult[x] = round(CumulativeDistributionFunction[x] * (L - 1)); // 
  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值