先均衡化一下图像亮度看看情况,方法:由BGR-->YCrCb--->均衡化Y--->BGR
代码如下:
#include <iostream>
#include <string>
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
const char* keys =
{
"{help h usage ? | | print this message}"
"{@image | | Image to process}"
};
cv::Mat equalize_y_channel( cv::Mat &src_img )
{
cv::Mat result;
cv::Mat ycrcb;
cv::cvtColor( src_img, ycrcb, cv::COLOR_BGR2YCrCb);
std::vector<cv::Mat> channels;
cv::split( ycrcb, channels );
//only equalize y
cv::equalizeHist( channels[0], channels[0] );
cv::merge( channels, ycrcb );
cv::cvtColor( ycrcb, result, cv::COLOR_YCrCb2BGR );
// imshow( "Equalize", result );
return result;
}
cv::Mat show_histograms( cv::Mat &src_img )
{
//split image to 3 channels
std::vector<cv::Mat> bgr;
cv::split( src_img, bgr );
//create 256 subinterval
//the number of possibles values
int numbins = 256;
//set the range for BGR(0-256)
float range[] = { 0, 256};
const float* histRange = { range };
cv::Mat b_hist, g_hist, r_hist;
cv::calcHist( &bgr[0], 1, 0, cv::Mat(), b_hist, 1, &numbins, &histRange );
cv::calcHist( &bgr[1], 1, 0, cv::Mat(), g_hist, 1, &numbins, &histRange );
cv::calcHist( &bgr[2], 1, 0, cv::Mat(), r_hist, 1, &numbins, &histRange );
//draw histogram
//draw lines for each channels
int width = 512;
int height = 300;
// Create image with gra