您的位置:首页 > 运维架构

opencv 学习之 直方图

2017-03-01 21:14 330 查看
定义:

直方图是图像中像素强度分布的图形表达方式.

它统计了每一个强度值所具有的像素个数

函数:

CV_EXPORTS void calcHist( const Mat* images, int nimages,
const int* channels, InputArray mask,
SparseMat& hist, int dims,
const int* histSize, const float** ranges,
bool uniform=true, bool accumulate=false );



images:输入的图像
nimages:被求取直方图的图像个数,该函数可求多个图像的直方图

channels:图像的通道,它是一个数组,如果是灰度图像则 channels[1] = {0};如果是彩色图像则 channels[3] = {0,1,2};如果是某个通道的直方图,则channels[1]={N}

mask:是一个遮罩图像用于确定哪些点参与计算,默认情况我们都设置为一个空图像,即:Mat()

hist:计算得到的直方图

dims:得到的直方图的维数,灰度图像为1维,彩色图像为3维

histSize:直方图横坐标的区间数。如果是10,则它会横坐标分为10份,然后统计每个区间的像素点总和。8位图像取值0-255,则一般设置为256即可,计算每个像素点数

ranges:这是一个二维数组,用来指出每个维度的范围

最后两个参数缺省即可

代码:

int showHist()
{
Mat img, gray;
img = imread("d://2.bmp");
if(img.empty()) return -1;
if(img.channels() == 1)
gray = img.clone();
else cvtColor(img, gray, CV_RGB2GRAY);

double minVal, maxVal;
minMaxLoc(gray, &minVal, &maxVal, 0, 0);
cout<<"minVal : "<<minVal<<endl;
cout<<"maxVal : "<<maxVal<<endl;

MatND hist;
int bins = 10;
int hist_size[] = {bins};
float range[] = { 0, 256 };
const float* ranges[] = { range};

int channels[] = {0};
calcHist( &gray, 1, channels, Mat(), hist, 1, hist_size, ranges, true, false);

//直方图高度
int height=gray.rows;
double max_val;
//直方图列宽度
int scale = 10;
//计算直方图最大值
minMaxLoc(hist, 0, &max_val, 0, 0);
//创建一个直方图图像并初始化为0
MatND imgHist = Mat::zeros(height, bins*scale, CV_8UC1);
cout<<"max_val = "<<max_val<<endl;
for(int i=0;i<bins;i++)
{
// 第i灰度级上的数
float bin_val = hist.at<float>(i);
//要绘制的高度
int intensity = cvRound(bin_val*height/max_val);
//填充第i灰度级的数据
rectangle(imgHist,Point(i*scale,height-1), Point((i+1)*scale - 1, height - intensity), Scalar(255,255,255));
}
imshow( "Hist", imgHist );

waitKey();
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv