opencv 绘制三通道的直方图

 

 

#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <opencv\cxcore.h>
#include <stdlib.h>
#include <stdio.h>
 

//绘制直方图
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("D:\\1.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);
 
        //释放资源

        //(1) 释放源图像
        cvReleaseImage(&src);

        //(2) 释放三个通道的图像
        cvReleaseImage(&imgRed);
        cvReleaseImage(&imgGreen);
        cvReleaseImage(&imgBlue);

        //(3)释放三个通道直方图
        cvReleaseImage(&histBlue);
        cvReleaseImage(&histGreen);
        cvReleaseImage(&histRed);

        //(4)释放直方图空间
        cvReleaseHist(&hist);

        return 0;
 
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV提供了一个函数cv::calcHist()来计算图像的直方图,在绘制之前需要将图像转换为灰度图像。下面是一个简单的示例代码,用于绘制灰度图像的直方图: ```cpp #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { // 读取图像 Mat image = imread("example.jpg", IMREAD_GRAYSCALE); // 定义直方图参数 int histSize = 256; // 直方图中条目的数量 float range[] = { 0, 256 }; // 像素值范围 const float* histRange = { range }; bool uniform = true, accumulate = false; // 计算直方图 Mat hist; calcHist(&image, 1, 0, Mat(), hist, 1, &histSize, &histRange, uniform, accumulate); // 绘制直方图 int hist_w = 512, hist_h = 400; int bin_w = cvRound((double)hist_w / histSize); Mat histImage(hist_h, hist_w, CV_8UC1, Scalar(0)); normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, -1, Mat()); for (int i = 1; i < histSize; i++) { line(histImage, Point((i - 1) * bin_w, hist_h - cvRound(hist.at<float>(i - 1))), Point((i)*bin_w, hist_h - cvRound(hist.at<float>(i))), Scalar(255), 2, LINE_AA); } // 显示绘制直方图 namedWindow("Histogram", WINDOW_AUTOSIZE); imshow("Histogram", histImage); waitKey(0); return 0; } ``` 在这个示例中,我们使用cv::calcHist()函数计算图像的直方图,然后使用cv::normalize()函数将直方图归一化,使其适合于图像显示。最后,我们使用cv::line()函数在一个新的Mat对象上绘制直方图,并使用cv::imshow()函数显示它。 需要注意的是,这个示例只绘制了灰度图像的直方图,如果需要绘制彩色图像的直方图,则需要将彩色图像转换为HSV颜色空间,然后计算每个通直方图,并将它们组合成一个三维直方图

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值