OpenCV 计算二维直方图

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);
}


     
     
    
    
   
   
  
  





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值