图像处理(二):直方图均衡化

直方图均衡化处理:通过重新均匀地分布各灰度值来增强图像对比度;

具体实现方法如下:

1、统计直方图数组,用Utable来记录Utable[i];

2、i从1开始,令Cumu[i] = Cumu[i-1] +Utable[i];

3、计算概率Pro[i]

4、计算直方图均衡化后的数值

具体代码如下:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;




int main()
{
	// 统计像素亮度的数目
	int Utable_b[256] = { 0 };
	int Utable_g[256] = { 0 };
	int Utable_r[256] = { 0 };

	// 计算累计数目
	int Cumu_b[256] = { 0 };
	int Cumu_g[256] = { 0 };
	int Cumu_r[256] = { 0 };

	// 计算频率
	float Pro_b[256] = { 0 };
	float Pro_g[256] = { 0 };
	float Pro_r[256] = { 0 };

	Mat src = imread("1.png");
	int i, j;
	//Mat gray;
	//cvtColor(src, gray, CV_BGR2GRAY);
	for (i = 0; i < src.rows; i++)
		for (j = 0; j < src.cols; j++)
		{
			Utable_b[src.at<Vec3b>(i, j)[0]]++;
			Utable_g[src.at<Vec3b>(i, j)[1]]++;
			Utable_r[src.at<Vec3b>(i, j)[2]]++;

		}

	// 计算累计个数
	float Sum_b = 0, Sum_g = 0, Sum_r = 0;
	for (i = 0; i < 256; i++)
	{
		Sum_b += Utable_b[i];
		Cumu_b[i] = Sum_b;

		Sum_g += Utable_g[i];
		Cumu_g[i] = Sum_g;

		Sum_r += Utable_r[i];
		Cumu_r[i] = Sum_r;

	}
	
	// 计算各个的概率
	for (i = 0; i < 256; i++)
	{
		Pro_b[i] = Cumu_b[i] / Sum_b;
		Pro_g[i] = Cumu_g[i] / Sum_g;
		Pro_r[i] = Cumu_r[i] / Sum_r;
		
	}

	Mat HistEqu = Mat::zeros(src.rows, src.cols, CV_8UC3);
	// 直方图均衡化
	for (i = 0; i < src.rows; i++)
		for (j = 0; j < src.cols; j++)
		{
			HistEqu.at<Vec3b>(i, j)[0] = cvRound(Pro_b[src.at<Vec3b>(i, j)[0]] * 255);
			HistEqu.at<Vec3b>(i, j)[1] = cvRound(Pro_g[src.at<Vec3b>(i, j)[1]] * 255);
			HistEqu.at<Vec3b>(i, j)[2] = cvRound(Pro_r[src.at<Vec3b>(i, j)[2]] * 255);

		}

	imshow("src", src);
	imshow("Hist", HistEqu);
	waitKey();

	return 0;


}
效果付下:


参考博客如下:

https://www.cnblogs.com/tianyalu/p/5687782.html

https://www.cnblogs.com/hustlx/p/5245461.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值