新版本对直方图不再使用之前的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:

  1. Calculate the histogram for src .

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

  3. Compute the integral of the histogram:

  4. 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
}
 
 
  • OPENCV(5) —— 图像直方图的更多相关文章

    1. 【图像处理】基于OpenCV实现图像直方图的原理

      背景 图像的直方图是衡量图像像素分布的一种方式,可以通过分析像素分布,使用直方图均衡化对图像进行优化,让图像变的清晰. opencv官方对图像直方图的定义如下: 直方图是图像中像素强度分布的图形表达方 ...

    2. OpenCV(7)-图像直方图

      直方图定义可参考这里.图像的直方图用来表示图像像素的统计信息,它统计了图像每一个通道(如果是多通道)中,每个像素的个数(比例). 计算直方图 OpenCV提供了直接计算直方图的函数 void calc ...

    3. 8、OpenCV Python 图像直方图

      __author__ = "WSX" import cv2 as cv import numpy as np from matplotlib import pyplot as pl ...

    4. opencv:图像直方图均衡化

      // 直方图均衡化 Mat gray, dst; cvtColor(src, gray, COLOR_BGR2GRAY); equalizeHist(gray, dst); imshow(" ...

    5. OpenCV 绘制图像直方图

      OpenCV绘制图像直方图,版本2.4.11 直方图可展示图像中的像素分布,是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数.可以借助观察该直方图了解需要如何调整亮度分布.这种直方 ...

    6. opencv:图像直方图相似性比较

      void hist_compare(Mat src1, Mat src2) { int histSize[] = { 256, 256, 256 }; int channels[] = { 0, 1, ...

    7. OpenCV成长之路(5):图像直方图的应用

      正如第4篇文章所说的图像直方图在特征提取方面有着很重要的作用,本文将举两个实际工程中非常实用的例子来说明图像直方图的应用. 一.直方图的反向映射. 我们以人脸检测举例,在人脸检测中,我们第一步往往需要 ...

    8. OpenCV成长之路(4):图像直方图

      一.图像直方图的概念 图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的.纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比. 图 ...

    9. OpenCV成长之路:图像直方图的应用

      OpenCV成长之路:图像直方图的应用 2014-04-11 13:57:03 标签:opencv 图像 直方图 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否 ...

    随机推荐

    1. 洛谷 P1541 乌龟棋 (四维费用背包)

      一开始直接用01背包 后来发现这个物品和位置有关. 也就是价值不是固定的 后来看了题解 看了卡片最多就4 所以这是一个四维费用的背包, 每一维是卡片的数量 价值就是当前的位置的价值. 但是与常规的背包 ...

    2. 洛谷 P3924 康娜的线段树

      P3924 康娜的线段树 题目描述 小林是个程序媛,不可避免地康娜对这种人类的“魔法”产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以维护一段区间的信息, ...

    3. JBOSS部署项目之后,无法通过IP地址訪问,仅仅能通过localhost或者127.0.0.1訪问

      这几天入职到了一家新的公司,然后第一天就開始搭建各种环境.由于原先一直用的是Tomcat容器,然后也是第一次接触JBOSS容器,搭建完之后,在MyEclipse中启动了JBOSS容器,然后想在浏览器中 ...

    4. android JNI 一维数组、二维数组的访问与使用

      在JNI中访问JAVA类中的整型.浮点型.字符型的数据比较简单,举一个简单的例子,如下: //得到类名 jclass cls = (*env)->GetObjectClass(env, obj) ...

    5. Dictionaries

      A dictionary is like a list, but more general. In a list, the indices have to be integers; in a dict ...

    6. OpenGL编程逐步深入(八)伸缩变换

      准备知识 伸缩变换非常简单,它的目的是增大或者缩小对象的尺寸.例如:你可能希望用同一个模型创建不同大小的对象(例如形状相同,但大小不同的树木)或者你想改变对象的大小使它和游戏场景匹配.这些例子中你可能 ...

    7. 二维码扫描ZXing简化

      最近项目中有需要用到二维码扫描功能,于是查了相关资料,也没有过多地研究ZXing源码,只是有了最简单的功能,因为下载大牛的demo已经完全实现了功能,只是对其中的扫描线做了更改,需要的朋友可以直接使用 ...

    8. VS2013+PTVS,python编码问题

      1.调试,input('中文'),乱码2.调试,print('中文'),正常3.不调试,input('中文'),正常4.不调试,print('中文'),正常 页面编码方式已经加了"# -- ...

    9. [洛谷P2085]最小函数值

      题目大意:有n个函数,分别为F1,F2,...,Fn.定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*).给定这些Ai.Bi和Ci,要求出所有函数的所有函数值中最小的m个(如有重复的要输出多个 ...

    10. Java 异常的捕获与处理详解(二)

      (一).throws关键字 throws关键字主要是在定义上使用的,表示的是此方法中不进行异常处理,而交给被调用处处理. 例如: class MyMath { public int div(int x ...