均衡化代码
#include <iostream> #include <vector> #include <opencv2/core.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/highgui.hpp> #include <opencv2/features2d.hpp> #include <opencv2/xfeatures2d.hpp> #include <opencv2/calib3d.hpp> #define IMAGE1_PATH “/home/jacob/图片/1.png“ #define IMAGE2_PATH “/home/jacob/图片/2.png“ #define IMAGE3_PATH “/home/jacob/图片/3.png“ using namespace std; using namespace cv; class Histogram1D { private: int histSize[1]; // 项的数量 float hranges[2]; // 统计像素的最大值和最小值 const float* ranges[1]; int channels[1]; // 仅计算一个通道 public: Histogram1D() { // 准备1D直方图的参数 histSize[0] = 256; hranges[0] = 0.0f; hranges[1] = 255.0f; ranges[0] = hranges; channels[0] = 0; } Mat getHistogram(const Mat &image) { Mat hist; // 计算直方图 calcHist(&image ,// 要计算图像的 1, // 只计算一幅图像的直方图 channels, // 通道数量 Mat(), // 不使用掩码 hist, // 存放直方图 1, // 1D直方图 histSize, // 统计的灰度的个数 ranges); // 灰度值的范围 return hist; } Mat getHistogramImage(const Mat &image) { Mat hist = getHistogram(image); //查找最大值用于归一化 double maxVal = 0; minMaxLoc(hist, NULL, &maxVal); //绘制直方图的图像 Mat histImg(histSize[0], histSize[0], CV_8U, Scalar(255)); // 设置最高点为最大值的90% double hpt = 0.9 * histSize[0]; //每个条目绘制一条垂直线 for (int h = 0; h < histSize[0]; h++) { //直方图的元素类型为32位浮点数 float binVal = hist.at<float>(h); int intensity = static_cast<int>(binVal * hpt / maxVal); line(histImg, Point(h, histSize[0]), Point(h, histSize[0] - intensity), Scalar::all(0)); } return histImg; } }; /** * @brief EqualizeImage 对灰度图像进行直方图均衡化 * @param src 输入图像 * @param dst 均衡化后的图像 */ void EqualizeImage(const Mat &src, Mat &dst) { Histogram1D hist1D; Mat hist = hist1D.getHistogram(src); hist /= (src.rows * src.cols); // 对得到的灰度直方图进行归一化,得到密度(0~1) float cdf[256] = {0}; // 灰度的累积概率 Mat lut(1, 256, CV_8U); // 创建用于灰度变换的查找表 for (int i = 0; i < 256; i++) { // 计算灰度级的累积概率 if (i == 0) cdf[i] = hist.at<float>(i); else cdf[i] = cdf[i - 1] + hist.at<float>(i); lut.at<uchar>(i) = static_cast<uchar>(255 * cdf[i]); // 创建灰度的查找表 } LUT(src, lut, dst); // 应用查找表,进行灰度变化,得到均衡化后的图像 }