新版本对直方图不再使用之前的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 of the 0-th histogram bin and the upper (exclusive) boundary 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: . The array elements, that are not between and , 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:
- Calculate the histogram for src .
- Normalize the histogram so that the sum of histogram bins is 255.
- Compute the integral of the histogram:
- Transform the image using as a look-up table:
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)
#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 }
时间: 2024-10-04 20:30:38