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;
}
直方图是图像中像素强度分布的图形表达方式.
它统计了每一个强度值所具有的像素个数
函数:
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学习系列(一)---直方图与匹配
- opencv学习之轮廓高级应用(轮廓匹配,几何直方图)
- OpenCV学习21--图像直方图
- python OpenCV学习笔记实现二维直方图
- 图像处理opencv直方图均值化-学习笔记2
- OpenCV 2 学习笔记(17): 均衡化图像直方图
- OpenCV学习二十三:calcHist,直方图
- opencv 学习之直方图统计
- 【从零学习openCV】使用直方图统计像素
- opencv 绘制直方图学习过程中的疑问记录
- Python OpenCV学习笔记之:图像直方图反向投影(backprojection)原理简单实现
- 学习OpenCV——绘制彩色直方图(HSV2BGR)
- 我的OpenCV学习笔记(13):计算直方图,利用查找表拉伸直方图,直方图均衡
- OpenCV学习笔记(八)——图像处理之直方图ImgProc
- opencv学习之四:rgb通道的分离以及直方图的显示计算
- OpenCV学习(26) 直方图(3)
- python OpenCV学习笔记直方图反向投影的实现
- opencv2 学习第7天 直方图的简单比较
- OpenCV学习——物体跟踪的粒子滤波算法实现之计算选定区域直方图
- OpenCV深入学习(6)--直方图之calcHist使用(补)