H-S直方图
为了描述图像的特性,常常需要分析HSV色彩空间下的直方图。要分析HSV色彩空间下的直方图,首先要将图像转换到HSV色彩空间中,然后将对
为了描述图像的特性,常常需要分析HSV色彩空间下的直方图。
要分析HSV色彩空间下的直方图,首先要将图像转换到HSV色彩空间中,然后将对应的H通道和S通道进行单元划分,最后在二维图像 上生成直方图。
代码示例如下:
#include <iostream>n#include <string>n#include <cmath>n#include <opencv2/opencv.hpp>nusing std::sin;nusing std::cos;n//使用CommandLineParser对输入的参数进行分析,获取输入的图片路径nstd::string GetFileName(int argc,char* argv[])n{n /*n argc : the size of argv[]n argv : the parameters of comdlinen */n const char* key = {n "{help h usage? || usage information}"n "{@picture || input picture}"n };n cv::CommandLineParser parser(argc,argv,key);n if (parser.has("help"))n {n parser.printMessage();n exit(0);n }n //如果没有输入图片路径n if (!parser.check())n {n parser.printErrors();n exit(-1);n }n std::string fileName = parser.get<std::string>(0);n return fileName;n}nint main(int argc,char* argv[])n{nn std::string fileName = GetFileName(argc,argv);n cv::Mat srcImage = cv::imread(fileName);n if (!srcImage.data)n {n std::cerr << "fail to load image" << std::endl;n exit(-1);n }n cv::Mat hsvImage;n cv::cvtColor(srcImage,hsvImage,cv::COLOR_BGR2HSV);n //直方图参数n int hbins = 30,sbins = 32;n int histSize[] = {hbins,sbins};n const int channels[] = {0,1};n float hranges[] = {0,180};n float sranges[] = {0,256};n const float *ranges[] = {hranges,sranges};n cv::MatND hist;n cv::calcHist(&hsvImage,1,channels,cv::Mat(),hist,2,histSize,ranges,true,false);n //找到直方图中得最大值n double maxVal = 0.0;n cv::minMaxLoc(hist,0,&maxVal,0,0);n int scale = 10;n cv::Mat histImage = cv::Mat::zeros(sbins*scale,hbins * scale,CV_8UC3);n for(int i=0;i < hbins;i++)n {n for(int j=0;j < sbins;j++)n {n float binValue = hist.at<float>(i,j);n int intensity = cvRound(binValue*255 / maxVal);n cv::rectangle(histImage,cv::Point(i*scale,j*scale),n cv::Point((i+1)*scale-1,(j+1)*scale-1),cv::Scalar::all(intensity),2,8,0);n }n }n cv::imshow("H-S HIst",histImage);n cv::imshow("srcImage",srcImage);n cv::waitKey(0);n cv::destroyAllWindows();n return 0;n}n
结果展示:
上一篇:拉格朗日量的Hessian条件
下一篇:王策做颅骨修补手术时间多长