直方图均衡化处理:通过重新均匀地分布各灰度值来增强图像对比度;
具体实现方法如下:
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