直方图均衡可以让图片有更高的对比度,效果如图:
原理部分参考: 地址
假设有如下图像:
得图像的统计信息如下图所示,并根据统计信息完成灰度值映射:
映射后的图像如下所示:
下面就是简单粗暴的代码了
#include<opencv2/opencv.hpp>
#include<vector>
using namespace std;
using namespace cv;
int main() {
Mat temp = imread("test.jpg",0);
imshow("原图", temp);
//equalizeHist(temp, temp);
int Total = temp.total();
//统计各像素数量
vector<int>像素(256, 0);
for (int i = 0; i < temp.total();++i)像素[temp.data[i]]++;
for (int i = 1; i < 256; ++i)像素[i]+=像素[i-1];
//重新建立映射关系
vector<int>均衡后像素值(256, 0);
for (int i = 0; i < 256; ++i) {
均衡后像素值[i] = double(像素[i]) / Total * 255;
}
for (int i = 0; i < temp.total(); ++i)temp.data[i] = 均衡后像素值[temp.data[i]];
imshow("均衡后", temp);
waitKey(-1);
}
或者直接调用Opencv的函数,一行代码就解决了……
#include<opencv2/opencv.hpp>
#include<vector>
using namespace std;
using namespace cv;
int main() {
Mat temp = imread("test.jpg",0);
imshow("原图", temp);
equalizeHist(temp, temp);
imshow("均衡后", temp);
waitKey(-1);
}