opencv学习笔记(二十九)绘制一个RGB三色直方图

#include <opencv2/opencv.hpp>
#define cvQueryHistValue_1D( hist, idx0 ) ((float)cvGetReal1D( (hist)->bins, (idx0)))
//绘制直方图
IplImage* DrawHistogram(CvHistogram* hist , float scaleX = 1 , float scaleY = 1)
{
        //获取直方图中极大值
        float histMax = 0; 
        cvGetMinMaxHistValue(hist , 0 ,&histMax ,0 ,0); 
        //创建图像 该图像用于显示直方图        
        IplImage* imgHist = cvCreateImage(cvSize(256*scaleX , 64*scaleY) , 8 ,1);
        //图像置零
        cvZero(imgHist); 
        //依次绘制直方图的bin
        for(int i=0;i<255;i++)
        {
                //获取直方图的值
           float histValue = cvQueryHistValue_1D(hist , i);
           float nextValue = cvQueryHistValue_1D(hist , i+1);

                //获取四边形的四个点的坐标                
        CvPoint pt1 = cvPoint(      i*scaleX , 64*scaleY);
        CvPoint pt2 = cvPoint(  (i+1)*scaleX , 64*scaleY);
        CvPoint pt3 = cvPoint(  (i+1)*scaleX , (64 - (nextValue/histMax)*64) *scaleY );
        CvPoint pt4 = cvPoint (      i*scaleX , (64 - (histValue/histMax)*64) *scaleY );

                int numPts = 5;
                CvPoint pts[5];

                pts[0] = pt1;
                pts[1] = pt2;
                pts[2] = pt3;
                pts[3] = pt4;
                pts[4] = pt1;

                //填充四边形                
        cvFillConvexPoly(imgHist , pts ,numPts , cvScalar(255));
        }
        return imgHist;
}



int main(int argc, char* argv[])
{
        //加载图像
        IplImage* src = cvLoadImage("b.jpg");

        cvNamedWindow("sr");
        cvShowImage("sr" , src);

        int dims = 1;  // 一维直方图
        int size =256; //bin的个数
        float range[] = {0,255}; //取值范围
        float* ranges[] = {range};
        CvHistogram* hist;
        //创建直方图
hist = cvCreateHist(dims , &size , CV_HIST_ARRAY ,  ranges , 1 );
        //清空直方图 
        cvClearHist(hist);
        //给B  G  R 三个通道的图像分配空间 
       IplImage* imgRed = cvCreateImage(cvGetSize(src) , 8 ,1);
       IplImage* imgGreen = cvCreateImage(cvGetSize(src) , 8 ,1);
       IplImage* imgBlue = cvCreateImage(cvGetSize(src) , 8 ,1);
        //将图像src  分解成B   G   R 三个通道
        //cvSplit最后一个通道为NULL
        cvSplit(src , imgBlue , imgGreen , imgRed , NULL);       
        //计算B通道 直方图  
        cvCalcHist(&imgBlue , hist , 0 , 0 ); 
        //绘制B通道直方图histBlue
        IplImage* histBlue = DrawHistogram(hist);
        //将B通道的直方图数据清空 
        cvClearHist(hist); 
        //计算G通道 直方图 
        cvCalcHist(&imgGreen , hist , 0 , 0 ); 
        //绘制G通道直方图  histGreen 
        IplImage* histGreen = DrawHistogram(hist); 
        //将G通道的直方图数据清空 
        cvClearHist(hist);
        //计算R通道 直方图
        cvCalcHist(&imgRed , hist , 0 , 0 );
        //绘制R通道直方图  histRed
        IplImage* histRed = DrawHistogram(hist);
        //将R通道的直方图数据清空 
        cvClearHist(hist);

        cvNamedWindow("B");
        cvNamedWindow("G");
        cvNamedWindow("R");

        cvShowImage("B"  , histBlue);
        cvShowImage("G"  , histGreen);
        cvShowImage("R"  , histRed);

        cvWaitKey(0);
        //释放资源
        //释放源图像
        cvReleaseImage(&src);
        //释放三个通道的图像
        cvReleaseImage(&imgRed);
        cvReleaseImage(&imgGreen);
        cvReleaseImage(&imgBlue);
        //释放三个通道直方图
        cvReleaseImage(&histBlue);
        cvReleaseImage(&histGreen);
        cvReleaseImage(&histRed);
        //释放直方图空间
        cvReleaseHist(&hist);
        return 0;
}

猜你喜欢

转载自blog.csdn.net/u014751607/article/details/60137658