zoukankan      html  css  js  c++  java
  • OPENCV(5) —— 图像直方图

    新版本对直方图不再使用之前的histogram的形式,而是用统一的Mat或者MatND的格式来存储直方图,可见新版本Mat数据结构的优势。

    C++: void calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, intdims, const int* histSize, const float** ranges, bool uniform=true, bool accumulate=false )

    计算直方图

    Parameters:

    • images – Source arrays. They all should have the same depth, CV_8U or CV_32F , and the same size. Each of them can have an arbitrary number of channels.
    • nimages – Number of source images.
    • channels – List of the dims channels used to compute the histogram. The first array channels are numerated from 0 to images[0].channels()-1 , the second array channels are counted fromimages[0].channels() to images[0].channels() + images[1].channels()-1, and so on.
    • mask – Optional mask. If the matrix is not empty, it must be an 8-bit array of the same size asimages[i] . The non-zero mask elements mark the array elements counted in the histogram.
    • hist – Output histogram, which is a dense or sparse dims -dimensional array.
    • dims – Histogram dimensionality that must be positive and not greater than CV_MAX_DIMS (equal to 32 in the current OpenCV version).
    • histSize – Array of histogram sizes in each dimension.
    • ranges – Array of the dims arrays of the histogram bin boundaries in each dimension. When the histogram is uniform ( uniform =true), then for each dimension i it is enough to specify the lower (inclusive) boundary L_0 of the 0-th histogram bin and the upper (exclusive) boundary U_{	exttt{histSize}[i]-1}for the last histogram bin histSize[i]-1 . That is, in case of a uniform histogram each ofranges[i] is an array of 2 elements. When the histogram is not uniform ( uniform=false ), then each of ranges[i] contains histSize[i]+1 elements:L_0, U_0=L_1, U_1=L_2, ..., U_{	exttt{histSize[i]}-2}=L_{	exttt{histSize[i]}-1}, U_{	exttt{histSize[i]}-1} . The array elements, that are not between L_0 and U_{	exttt{histSize[i]}-1} , are not counted in the histogram.
    • uniform – Flag indicating whether the histogram is uniform or not (see above).
    • accumulate – Accumulation flag. If it is set, the histogram is not cleared in the beginning when it is allocated. This feature enables you to compute a single histogram from several sets of arrays, or to update the histogram in time.

    void rectangle(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, intshift=0)

    画矩形

    #include "stdafx.h"
    
    #include <cv.h>
    #include <highgui.h>
    
    using namespace cv;
    
    int main( int argc, char** argv )
    {
        Mat src, hsv;
        
        /* if( argc != 2 || !(src=imread(argv[1], 1)).data )
            return -1; */
    
        src=imread("zhang.jpg", 1);
    
        cvtColor(src, hsv, CV_BGR2HSV);
    
        // Quantize the hue to 30 levels
        // and the saturation to 32 levels
        int hbins = 30, sbins = 32;        // bin 步长
    
        int histSize[] = {hbins, sbins};
        // hue varies from 0 to 179, see cvtColor
        float hranges[] = { 0, 180 };
        // saturation varies from 0 (black-gray-white) to
        // 255 (pure spectrum color)
        float sranges[] = { 0, 256 };
        const float* ranges[] = { hranges, sranges };    
        MatND hist;
        // we compute the histogram from the 0-th and 1-st channels
        int channels[] = {0, 1};   // --- hue && saturation
    
        calcHist( &hsv, 1, channels, Mat(), // do not use mask
            hist, 2, histSize, ranges,
            true, // the histogram is uniform
            false );
        double maxVal=0;
        minMaxLoc(hist, 0, &maxVal, 0, 0);  // Finds the global minimum and maximum in an array.
            // void minMaxLoc(InputArray src, double* minVal, double* maxVal=0, Point* minLoc=0, Point* maxLoc=0, InputArray mask=noArray())
    
        // 直方图显示
        int scale = 10;
        Mat histImg = Mat::zeros(sbins*scale, hbins*10, CV_8UC3);
    
        for( int h = 0; h < hbins; h++ )
            for( int s = 0; s < sbins; s++ )
            {
                float binVal = hist.at<float>(h, s);
                int intensity = cvRound(binVal*255/maxVal);
                rectangle( histImg, Point(h*scale, s*scale),
                    Point( (h+1)*scale - 1, (s+1)*scale - 1),
                    Scalar::all(intensity),    // 二维直方图,颜色之深浅代表出现个数之多寡
                    CV_FILLED );
            }
    
            namedWindow( "Source", 1 );
            imshow( "Source", src );
    
            namedWindow( "H-S Histogram", 1 );
            imshow( "H-S Histogram", histImg );
            waitKey();
    }

    C++: void equalizeHist(InputArray src, OutputArray dst)

    直方图均衡化

    Parameters:

    • src – Source 8-bit single channel image.
    • dst – Destination image of the same size and type as src .

     

    The function equalizes the histogram of the input image using the following algorithm:

    1. Calculate the histogram H for src .

    2. Normalize the histogram so that the sum of histogram bins is 255.

    3. Compute the integral of the histogram:

      H'_i =  sum _{0  le j < i} H(j)

    4. Transform the image using H' as a look-up table: 	exttt{dst}(x,y) = H'(	exttt{src}(x,y))

    5. 1$6V58P4KC244M0{Z@`355T

     

    compareHist

    double compareHist(const SparseMat& H1, const SparseMat& H2, int method)

    直方图比较

    Parameters:

    • H1 – First compared histogram.
    • H2 – Second compared histogram of the same size as H1 .
    • method

      Comparison method that could be one of the following:

      • CV_COMP_CORREL Correlation  相关性 相同为1,范围0<x<=1
      • CV_COMP_CHISQR Chi-Square   卡方 相同为0 [0,inf)
      • CV_COMP_INTERSECT Intersection   直方图交 ,数值越大越相似
      • CV_COMP_BHATTACHARYYA Bhattacharyya distance
      • CV_COMP_HELLINGER Synonym for CV_COMP_BHATTACHARYYA Bhattacharyya 距离,相同为0 [0,inf)

    LO@89EMPHLM[S1BBYP3[3[Y

    #include "stdafx.h"
    
    #include <cv.h>
    #include <highgui.h>
    #include "stdio.h"
    
    using namespace std;
    using namespace cv;
    
    int main( int argc, char** argv )
    {
        Mat src1, src2,dst;
        Mat hsv1,hsv2;
        MatND hist1,hist2;
        
    
        src1=imread("zhang.jpg", 1);
        src2=imread("zhou.jpg",1);
        cvtColor(src1,hsv1,CV_RGB2HSV);
        cvtColor(src2,hsv2,CV_RGB2HSV);
    
        int hbins=30,sbins=32;
        int histSize[]={hbins,sbins};
    
        float hranges[]={0,180};
        float sranges[]={0,256};
        const float* ranges[]={hranges,sranges};
    
        
        int channels[]={0,1};
    
        calcHist(&hsv1,1,channels,Mat(),hist1,2,histSize,ranges,true,false);
        calcHist(&hsv2,1,channels,Mat(),hist2,2,histSize,ranges,true,false);
    
    
        double temp;
        temp=compareHist(hist1,hist2,CV_COMP_CORREL);
        cout<<"CV_COMP_CORREL  "<<temp<<endl;
    
        temp=compareHist(hist1,hist2,CV_COMP_CHISQR);
        cout<<"CV_COMP_CHISQR  "<<temp<<endl;
    
        temp=compareHist(hist1,hist2,CV_COMP_INTERSECT);
        cout<<"CV_COMP_INTERSECT  "<<temp<<endl;
    
        temp=compareHist(hist1,hist2,CV_COMP_BHATTACHARYYA);
        cout<<"CV_COMP_BHATTACHARYYA  "<<temp<<endl;
    
    
        namedWindow("src1");
        imshow("src1",src1);
    
        namedWindow("src2");
        imshow("src2",src2);
    
        waitKey();
    
        cvDestroyAllWindows();
        return 0;
    }

    遇到 ~ 编译器错误 C2078

    初始值设定项的数目超过了要初始化的对象数。

    // C2078.cpp
    int main() {
       int d[2] = {1, 2, 3};   // C2078
       int e[2] = {1, 2};   // OK
    
       char a[]={"a", "b"};   // C2078
       char *b[]={"a", "b"};   // OK
       char c[]={'a', 'b'};   // OK
    }
     
     
查看全文
  • 相关阅读:
    MOSS项目开发 周记(第十四周)
    MOSS项目开发 周记(第十七周)
    MOSS项目开发 周记(第十一周)
    MOSS项目开发 周记(第九周)
    MOSS项目开发 周记(第十三周)
    MOSS项目开发 周记(第十周)
    MOSS项目开发 周记(第十二周)
    MOSS项目开发 周记(第十六周)
    php中echo(),print(),print_r()的区别
    11个有用的移动网页开发App和HTML5框架
  • 原文地址:https://www.cnblogs.com/sprint1989/p/4070774.html
  • Copyright © 2011-2022 走看看