OpenCV计算二维直方图 Hue-Saturation 直方图
Visual Studio 2012 + OpenCV2.4.5
// Hue_Saturation_2DHist.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#include
using namespace std;
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
string filename = "E:\\素材\\flower1.jpg";
string winname = "MainWindow";
namedWindow(winname,0);
Mat src, hsv;//声明原始图像和目标图像
/// 装载图像
src = imread( filename, 1 );
if( !src.data ) //判断图像是否成功读取
{ return -1; }
///显示读入的图像
imshow(winname,src);
cvtColor(src,hsv,CV_BGR2HSV);//将R、G、B图像转换为HSV格式
int hbins = 30, sbins = 32; //将Hue值量化为30个级别,Saturation量化为32个级别
const int histSize[] = { hbins , sbins};//直方图中Hue维度和Saturation维度的大小
float hranges[] = {0,180}; //hue值取值范围是【0,179】
float sranges[] = {0,256}; //saturation的取值范围[0,255]
const float* histRanges[] = {hranges , sranges};
MatND hist;//声明一个多维数组
int channels[] = {0,1};//要统计h-s直方图,所以要索引hsv图像的第0和第1个通道
calcHist(&hsv,1,channels,Mat(),hist,2,histSize,histRanges,true,false); //调用calcHist()计算直方图
double maxVal=0;
minMaxLoc(hist, 0, &maxVal, 0, 0); //找到直方图矩阵hist中的最大值
int scale = 10; //直方图的每一维上一个矩形条的宽度
//创建直方图画布,画布矩阵中同行的saturation值相同,同列的hue值相同
Mat histimage = Mat::zeros(sbins*scale,hbins*scale,CV_8UC3);
//扫描直方图,填充画布
for(int h=0; h
(h,s)
float binValue = hist.at
(h,s);
//将直方图中的值归一化到0到255
int intensity = cvRound(binValue*255/maxVal);
//画矩形柱状图,Point的坐标中x值对应着hue维度,y值对应值saturation维度,这与画布矩阵必须一致
rectangle(histimage,Point(h*scale,s*scale),Point((h-1)*scale-1,(s-1)*scale-1),Scalar::all(intensity),CV_FILLED);
}
}
namedWindow( "H-S Histogram", 1 );
imshow( "H-S Histogram", histimage );
return waitKey(0);
}