显示R,G,B分量的颜色直方图

直方图计算: 输入图像Mat,储存直方图Mat,直方图画布Mat

void R_histogram(Mat src,Mat histimg)
{
//------------------------计算直方图----------------------------// 
    int histsize =256;//bin数量
    float range[] = {0,255};//2个数的数组
    const float* histRange = {range};//取值范围,histRange指针指向range数组
    Mat r_Hist;

    //输入数组的个数1,单通道0,储存直方图的矩阵r_Hist,直方图维数1,每个维度的bin数目&histsize,每个维度的取值范围&histRange,bin大小相同,清除直方图痕迹
    calcHist(&src,1,0,Mat(),r_Hist,1,&histsize,&histRange,true,false);
//------------------------直方图归一化----------------------------// 
    //直方图的画布histImage
    histimg = Scalar::all(0);//只在R直方图上清零
    int bin_w = cvRound( (double) histimg.cols/histsize );//四舍五入
    //将直方图归一化到范围 [0, hist_h]
    normalize(r_Hist,r_Hist,0,histimg.rows,NORM_MINMAX,-1,Mat());
//------------------------画直方图----------------------------//
    for (int i = 1; i<histsize; i++)
    {

        line( histimg, Point( bin_w*(i-1), histimg.rows - cvRound(r_Hist.at<float>(i-1)) ) ,
                          Point( bin_w*(i), histimg.rows - cvRound(r_Hist.at<float>(i)) ),
                          Scalar( 0, 0, 255), 0.1 );

    }
    
}

void G_histogram(Mat src,Mat histimg)
{
    //vector<Mat> rgb_channel;
    //split(src, rgb_channel);
//------------------------计算直方图----------------------------// 
    int histsize =256;//bin数量
    float range[] = {0,255};//2个数的数组
    const float* histRange = {range};//取值范围,histRange指针指向range数组
    Mat g_Hist;

    //输入数组的个数1,单通道0,储存直方图的矩阵g_Hist,直方图维数1,每个维度的bin数目&histsize,每个维度的取值范围&histRange,bin大小相同,清除直方图痕迹
    calcHist(&src,1,0,Mat(),g_Hist,1,&histsize,&histRange,true,false);

//------------------------直方图归一化----------------------------// 
    //直方图的画布histimg
    int bin_w = cvRound( (double) histimg.cols/histsize );//四舍五入
    //将直方图归一化到范围 [0, histimg.rows]
    normalize(g_Hist,g_Hist,0,histimg.rows,NORM_MINMAX,-1,Mat());
//------------------------画直方图----------------------------//
    for (int i = 1; i<histsize; i++)
    {

        line( histimg, Point( bin_w*(i-1), histimg.rows - cvRound(g_Hist.at<float>(i-1)) ) ,
                        Point( bin_w*(i), histimg.rows - cvRound(g_Hist.at<float>(i)) ),
                          Scalar( 0, 255, 0), 0.1 );

     
    }
    
}


void B_histogram(Mat src,Mat histimg)
{
//------------------------计算直方图----------------------------// 
    int histsize =256;//bin数量
    float range[] = {0,255};//2个数的数组
    const float* histRange = {range};//取值范围,histRange指针指向range数组
    Mat b_Hist;

    //输入数组的个数1,单通道0,储存直方图的矩阵b_Hist,直方图维数1,每个维度的bin数目&histsize,每个维度的取值范围&histRange,bin大小相同,清除直方图痕迹
    calcHist(&src,1,0,Mat(),b_Hist,1,&histsize,&histRange,true,false);

//------------------------直方图归一化----------------------------// 
    // 创建显示直方图的画布histImage[hist_w ,hist_h]
    int bin_w = cvRound( (double) histimg.cols/histsize );//四舍五入
    //将储存直方图的Mat归一化到范围 [0, hist_h]
    normalize(b_Hist,b_Hist,0,histimg.rows,NORM_MINMAX,-1,Mat());
//------------------------画直方图----------------------------//
    for (int i = 1; i<histsize; i++)
    {

        line( histimg, Point( bin_w*(i-1), histimg.rows - cvRound(b_Hist.at<float>(i-1)) ) ,
                        Point( bin_w*(i), histimg.rows - cvRound(b_Hist.at<float>(i)) ),
                          Scalar(255,0,0), 0.1 );
     
    }
    
}

void main()
{    

    Mat src,src1;
    src = imread("weed.jpg");
    src1 = imread("beijing.jpg");
    Mat histimg = Mat(400, 400, CV_8UC3);


    vector<Mat> rgb_channel;
    split(src, rgb_channel);
    Mat R=rgb_channel[2];
    Mat G=rgb_channel[1];
    Mat B=rgb_channel[0];

    R_histogram(R,histimg);
    G_histogram(G,histimg);
    B_histogram(B,histimg);
    namedWindow("rgb_Histogram");
    imshow("rgb_Histogram",histimg);
    waitKey(0);

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值