H-S直方圖的作用
阿新 • • 發佈:2018-12-11
為了刻畫影象中顏色的直觀特性,常常需要分析影象的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(&hsvMat, 1, channels, cv::Mat(), hist, 2, histSize, ranges, true, false); double maxVal = 0; //找到直方圖最大值 cv::minMaxLoc(hist, 0, &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 < hbins; h++) { for (int s = 0; s < sbins; s++) { float binVal = hist.at<float>(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;
}