关于直方图的介绍很多blogs都有讲到,还有一些有交互操作,这里的是一个非常简单的程序,只是基本做到基础功能。程序也是由书本改过来的,就是不明白为什么他要把那些定义private,我直接调试是调不通的,因为少一个}的说,改变位置后面加分号程序又错误。C++学得不扎实,只好把定义放出来了
#include "stdafx.h"
#include <iostream>
#include<core/core.hpp>
#include<highgui/highgui.hpp>
#include <imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int histSize[1];// 项的数量
float hranges[2];//像素的最小及最大值
const float*ranges[1];
int channels[1];//仅用到一个通道
class Histogram1D {
/*private :
int histSize[1];// 项的数量
float hranges[2];//像素的最小及最大值
const float*ranges[1];
int channels[1];//仅用到一个通道 */
public :
Histogram1D (){
histSize[0]=256;
hranges[0]=0.0;
hranges[1]=255.0;
ranges[0]=hranges;
channels[0]=0;
}
};
//计算1D直方图
cv::MatND getHistogram (const cv::Mat &image){
cv::MatND hist;
calcHist (&image,1,channels,cv::Mat(),hist,1,histSize,ranges);
return hist;
}
cv::Mat getHistogramImage (const cv::Mat &image)
{
//首先计算直方图
cv::MatND hist =getHistogram(image);
double maxVal=0;
double minVal=0;
minMaxLoc (hist,&minVal,&maxVal,0,0);
cv::Mat histImg (histSize[0],histSize[0],CV_8U,cv::Scalar(255));
int hpt =static_cast<int>(0.9*histSize[0]);
for (int h=0;h<histSize[0];h++){
float binVal =hist.at<float>(h);
int intensity =static_cast<int>(binVal*hpt/maxVal);
line(histImg,cv::Point(h,histSize[0]),cv::Point(h,histSize[0]-intensity),cv::Scalar::all(0));
}
return histImg;
}
int _tmain(int argc, _TCHAR* argv[])
{
/* Mat image= imread ("IMG_20170329_155039.jpg");
if (!image.data)
{
cout<<"Cannot load the image"<<endl;
return -1;
}
int cols=image.cols;
int rows=image.rows;
Mat imageROI;
imageROI=image (cv::Rect(cols/4,rows*0.6,720,720));
cv::imwrite ("cutroi.jpg",imageROI);
cv::imshow("CUT",imageROI); */
Mat im=imread("cutroi.jpg",0);//以黑白模式打开
Histogram1D h; //histogram 对象
imshow ("Histogram",getHistogramImage(im));
waitKey ();
system ("pause");
}
#include "stdafx.h"
#include <iostream>
#include<core/core.hpp>
#include<highgui/highgui.hpp>
#include <imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int histSize[1];// 项的数量
float hranges[2];//像素的最小及最大值
const float*ranges[1];
int channels[1];//仅用到一个通道
class Histogram1D {
/*private :
int histSize[1];// 项的数量
float hranges[2];//像素的最小及最大值
const float*ranges[1];
int channels[1];//仅用到一个通道 */
public :
Histogram1D (){
histSize[0]=256;
hranges[0]=0.0;
hranges[1]=255.0;
ranges[0]=hranges;
channels[0]=0;
}
};
//计算1D直方图
cv::MatND getHistogram (const cv::Mat &image){
cv::MatND hist;
calcHist (&image,1,channels,cv::Mat(),hist,1,histSize,ranges);
return hist;
}
cv::Mat getHistogramImage (const cv::Mat &image)
{
//首先计算直方图
cv::MatND hist =getHistogram(image);
double maxVal=0;
double minVal=0;
minMaxLoc (hist,&minVal,&maxVal,0,0);
cv::Mat histImg (histSize[0],histSize[0],CV_8U,cv::Scalar(255));
int hpt =static_cast<int>(0.9*histSize[0]);
for (int h=0;h<histSize[0];h++){
float binVal =hist.at<float>(h);
int intensity =static_cast<int>(binVal*hpt/maxVal);
line(histImg,cv::Point(h,histSize[0]),cv::Point(h,histSize[0]-intensity),cv::Scalar::all(0));
}
return histImg;
}
int _tmain(int argc, _TCHAR* argv[])
{
/* Mat image= imread ("IMG_20170329_155039.jpg");
if (!image.data)
{
cout<<"Cannot load the image"<<endl;
return -1;
}
int cols=image.cols;
int rows=image.rows;
Mat imageROI;
imageROI=image (cv::Rect(cols/4,rows*0.6,720,720));
cv::imwrite ("cutroi.jpg",imageROI);
cv::imshow("CUT",imageROI); */
Mat im=imread("cutroi.jpg",0);//以黑白模式打开
Histogram1D h; //histogram 对象
imshow ("Histogram",getHistogramImage(im));
waitKey ();
system ("pause");
}