1. 程式人生 > >H-S直方圖的作用

H-S直方圖的作用

為了刻畫影象中顏色的直觀特性,常常需要分析影象的HSV空間下的直方圖特性。HSV空間是由色調、飽和度、以及亮度構成,因此在進行直方圖計算時,需要先將源RGB影象轉化為HSV顏色空間影象,然後將對應的H和S通道進行單元劃分,再其二維空間上計算相對應直方圖,再次在通過計算直方圖空間上的最大值,歸一化繪製相應的直方圖資訊。色相飽和度直方圖通常應用在目標檢測、特徵分析以及目標特徵跟蹤等場景。

程式碼如下:

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"
#include <stdio.h>
#include <string>
using namespace std;
using namespace cv;
int main()
{
	cv::Mat hsvMat;
	cv::Mat srcImage = cv::imread("C:\\Users\\LP\\Desktop\\C++\\ConsoleApplication4\\ConsoleApplication4\\RGBFlower4.jpg");
if (srcImage.empty())
{
	return -1;
} 
cv::imshow("原影象", srcImage);
//灰度轉換
cv::Mat srcGray;
cv::cvtColor(srcImage, hsvMat, CV_BGR2HSV);
cv::imshow("hsvMat", hsvMat);
//初始化灰度階引數
int hbins = 30;
int sbins = 32;
int histSize[] = {hbins, sbins};
//灰度變化範圍設定
float hranges[] = {0, 180};
//飽和度變化範圍
float sranges[] = {0, 256};
const float* ranges[] = {hranges, sranges};
cv::MatND hist;

//選取計算直方圖通道
int channels[] = {0, 1};
//計算當前通道直方圖
cv::calcHist(&amp;hsvMat, 1, channels, cv::Mat(), hist, 2, histSize, ranges, true, false);
double maxVal = 0;
//找到直方圖最大值
cv::minMaxLoc(hist, 0, &amp;maxVal, 0, 0);
int scale = 10;
cv::Mat histImage = cv::Mat::zeros(sbins*scale, hbins*10, CV_8UC3);
//遍歷H、S通道
for (int h = 0; h &lt; hbins; h++)
{
	for (int s = 0; s &lt; sbins; s++)
	{
		float binVal = hist.at&lt;float&gt;(h, s);
		//根據最大值計算變化範圍
		int intensity = cvRound(binVal*255/maxVal);
		//繪圖顯示
		cv::rectangle(histImage, cv::Point(h*scale, s*scale), 
			cv::Point((h+1)*scale-1, (s+1)*scale-1), cv::Scalar::all(intensity), CV_FILLED);
	}
}

cv::imshow("H-S Histogram", histImage);
cv::waitKey(0);
return 0;

}