H-S直方图,opencv

来源:互联网 发布:什么叫网络编程 编辑:程序博客网 时间:2024/05/17 02:59
为了刻画图像中颜色的直观特性,常常需要分析图像的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;}


原创粉丝点击