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

来源:互联网 发布:变音软件 编辑:程序博客网 时间:2024/04/20 08:33

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

具体实现方法如下:

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

原创粉丝点击