/*
1、图像均衡(直方图均衡化)试图获得具有均匀分布值的直方图
2、均衡的结果是图像对比度的增强。
3、均衡能够使得对比度较低的局部区域得到高对比度,从而分散最频繁的强度。
4、当图像非常暗或者非常亮,并且背景和前景之间存在非常小的差异时,非常有用。
5、通过使用直方图均衡化,可以增加对比度,并提升暴露过度或暴露不足的细节。
缺点:背景噪声的增加以及随之而来的有用信号的减少。
VERSION :OpenCV 4.1.0
*/
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
Mat img;
const string path = "E:\\Codes\\A_VS\\1_OpenCV\\nature_monte.bmp";
/*
为了均衡彩色图像,只需要均衡亮度通道。可以用每个颜色通道执行该操作,但结果不能使用。
任何形式的彩色图像格式(HSV和YCrCb)来分离单个通道中的亮度分量,如下所示选择YCrCb并用Y通道
(亮度)进行均衡。
*/
void equalizeCallback(int state=0, void* userData=NULL)
{
Mat result;
// Convert BGR image to YCbCr
Mat ycrcb;
//用cvtColor函数将BGR图像转化为YCrCb
cvtColor(img, ycrcb, COLOR_BGR2YCrCb);
// Split image into channels
vector<Mat> channels;
split(ycrcb, channels);
// Equalize the Y channel only
//函数只有两参数:输入参数和输出参数
equalizeHist(channels[0], channels[0]);
// Merge the result channels
//合成生成的通道并将其转换为BGR格式
merge(channels, ycrcb);
// Convert color ycrcb to BGR
cvtColor(ycrcb, result, COLOR_YCrCb2BGR);
// Show image
imshow("Equalized", result);
waitKey(0);
destroyAllWindows();
}
int main()
{
img = imread(path, IMREAD_COLOR);
namedWindow("RAW", WINDOW_AUTOSIZE);
moveWindow("RAW", 100, 100);
namedWindow("Equalized", WINDOW_AUTOSIZE);
moveWindow("Equalized", 100 + img.cols, 100);
imshow("RAW", img);
equalizeCallback();
return 0;
}
/*
The algorithm normalizes the brightness and increases the contrast of the image.
@param src Source 8-bit single channel image.
@param dst Destination image of the same size and type as src
*/
void equalizeHist( InputArray src, OutputArray dst );
equalizeHist()函数,源图src必须是8位一维图像,目标图像dst也是8位一维图像,对于彩色图像,必须分通道逐一处理。但在实际中,RGB图像中的每个通道单独应用直方图均衡不太可能给出美观的结果,更好的做法,将LAB转换为更适合的空间,然后直方图均衡化用于亮度通道。