/*******************************************************
测试程序 【直方图计算】
时间:2016年8月31日
函数:equalizeHist
//【计算直方图】 Compute the histograms:
//参数:src,源数组个数,每个通道(1 dim = 0),Mat(),
每个bin尺寸归一化,直方图初始化清零
calcHist( &bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRange, uniform, accumulate );
//【归一化输出结果】
//参数:src,dst,0,histImage.rows(归一化上下限),?,?
normalize(b_hist, b_hist, 0,
histImage.rows, NORM_MINMAX, -1, Mat() );
********************************************************/
int main(void)
{
Mat src, dst;
src = imread("YY01.jpg", 1 );
//【BRG——通道分离】
vector<Mat> bgr_planes;
split( src, bgr_planes );
int histSize = 256;
//【256条】
float range[] = { 0, 256 } ;
//【设置范围(一维数组0,256)】
const float* histRange = { range };
//【常量指针 float*(范围指针)】
bool uniform = true;
bool accumulate = false;
Mat b_hist, g_hist, r_hist; //灰度矩阵*3
//【计算直方图】
calcHist( &bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRange, uniform, accumulate );
calcHist( &bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRange, uniform, accumulate );
calcHist( &bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, uniform, accumulate );
//【绘制直方图BGR】
int hist_w = 512; //宽
int hist_h = 400; //高
int bin_w = cvRound( (double) hist_w/histSize ); //bin宽度
Mat histImage( hist_h, hist_w, CV_8UC3, Scalar( 0,0,0) ); //初始化Mat histImage(x,y,CV_8UC3, ~ )
//【归一化输出结果】
//参数:src,dst,0,histImage.rows(归一化上下限),?,?
normalize(b_hist, b_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );
normalize(g_hist, g_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );
normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );
//【绘制每一个通道】 Draw for each channel
for( int i = 1; i < histSize; i++ )
{
line( histImage, Point( bin_w*(i-1), hist_h - cvRound(b_hist.at<float>(i-1)) ) ,
Point( bin_w*(i), hist_h - cvRound(b_hist.at<float>(i)) ),
Scalar( 255, 0, 0), 2, 8, 0 );
line( histImage, Point( bin_w*(i-1), hist_h - cvRound(g_hist.at<float>(i-1)) ) ,
Point( bin_w*(i), hist_h - cvRound(g_hist.at<float>(i)) ),
Scalar( 0, 255, 0), 2, 8, 0 );
line( histImage, Point( bin_w*(i-1), hist_h - cvRound(r_hist.at<float>(i-1)) ) ,
Point( bin_w*(i), hist_h - cvRound(r_hist.at<float>(i)) ),
Scalar( 0, 0, 255), 2, 8, 0 );
}
imshow("YY01", src );
imshow("calcHist Demo", histImage );
waitKey(0);
return 0;
}
【opencv练习28 - 直方图计算】
最新推荐文章于 2022-03-22 15:54:57 发布