opencv histogram

来源:互联网 发布:电商美工是干什么的 编辑:程序博客网 时间:2024/05/14 18:45

 https://www.douban.com/note/545836966/

#define cvQueryHistValue_1D( hist, idx0 ) \  

                 ((float)cvGetReal1D( (hist)->bins, (idx0)))  
或者:
   #include <opencv2/legacy/compat.hpp>


 -------   第一个 OPENCV 程序,不要笑话我是菜鸟呀,以前以为不会用到opencv呢  ------------------
#include <stdio.h>
#include <opencv2/opencv.hpp>


using namespace cv;


int main(int argc, char** argv )
{
    if ( argc != 2 )
    {
        printf("usage: DisplayImage.out <Image_Path>\n");
        return -1;
    }


    Mat image;
    image = imread( argv[1], 1 );


    if ( !image.data )
    {
        printf("No image data \n");
        return -1;
    }
    namedWindow("Display Image", WINDOW_AUTOSIZE );
    imshow("Display Image", image);


    waitKey(0);


    return 0;
}
------------------------------------------------------------------------------------------------------
cmake_minimum_required(VERSION 2.8)
project( DisplayImage )
find_package( OpenCV REQUIRED )


add_executable( DisplayImage DisplayImage.cpp )
target_link_libraries( DisplayImage ${OpenCV_LIBS} )


------------------------------------ second ------------------------------
#include "opencv2/opencv.hpp"
#define cvQueryHistValue_1D( hist, idx0 )    ((float)cvGetReal1D( (hist)->bins, (idx0)))


int main()
{
        IplImage* src= cvLoadImage("./woman.jpg");
        IplImage* gray_dst= cvCreateImage(cvGetSize(src), 8, 1);
        cvCvtColor(src, gray_dst, CV_BGR2GRAY);


        //一维维数
    int dims= 1;
        //直方图的尺寸
        int size= 256;
        //直方图的高度
        int height = 256;
        //灰度图的范围0到255
        float range[]= {0, 256};
        float *ranges[]= {range}; 
    
        //创建一维直方图
        CvHistogram* hist;
        hist= cvCreateHist(dims, &size, CV_HIST_ARRAY, ranges, 1);      


        //计算灰度图的一维直方图
        cvCalcHist(&gray_dst, hist, 0, 0);
    //归一化直方图
        cvNormalizeHist(hist, 1.0);


        int scale= 2;
        //创建图像,用于显示直方图
        IplImage* hist_img= cvCreateImage(cvSize(size* scale, height), 8, 3);
        //图像置零
    cvZero(hist_img);


         //计算直方图的最大方块值,初始化为0
         float max_value= 0;
         cvGetMinMaxHistValue(hist, 0, &max_value, 0, 0);


         //绘制直方图
     for(int i=0; i<size; i++)
         {
             float bin_val= cvQueryHistValue_1D(hist, i);   //像素i的概率
                 int intensity = cvRound(bin_val* height/ max_value);  // 绘制的高度
                 cvRectangle(hist_img, cvPoint(i* scale, height- 1),
             cvPoint((i+1)* scale- 1, height- intensity), RGB(255, 255, 255));
         }


         cvNamedWindow("gray");
         cvShowImage("gray", gray_dst);
         cvNamedWindow("Histogram");
     cvShowImage("Histogram", hist_img);


         cvWaitKey(0);


         cvReleaseImage(&src);
         cvReleaseImage(&gray_dst);
         cvReleaseImage(&hist_img);


         cvDestroyWindow("gray");
         cvDestroyWindow("Histogram");
}
1 0