opencv 绘制图像直方图
2014-02-27 20:42
239 查看
#include"cv.h"
#include"highgui.h"
int main()
{
//1、先读取一副单通道图像
IplImage*scr=cvLoadImage("C:\\111.jpg",0);
//2、创建一个直方图结果,为下面计算图像的直方图做准备。
int dims=1;
int nHistSize = 256;
float fRange[] = {0, 255};
float *pfRanges[] = {fRange}; //这里的pfRanges 是一个指针,他指向一个数组,数组中包含的元素是指针。
//灰度级的范围 一个数组,数组的名就是一个常指针,把这个指针放到一个数组中,就形成了指针数组,
//那么这个数组的名字还是一个指针,只是这个指针指向了包含了指针的数组的首地址,所以说该指针也就是指针的指针。
//指针数组:储存了指针的数组;数组指针,指向数组的指针。
CvHistogram *pcvHistogram = cvCreateHist(dims, &nHistSize, CV_HIST_ARRAY, pfRanges);
//(直方图维数,维数尺寸的数组,直方图的表示格式CV_HIST_ARRAY 多维密集数组 CV_HIST_TREE 多维稀疏数组,图中方块范围的数组,归一化标识)
// 这里设置维数是多少,那么nHistSize的维数就是多少,每一维就代表对应维数的直方图的大小。
//例如:我建立一个二维直方图,每个直方图的大小为128,256。那么dims=2,nHistSize[] = {128,256}
//注意:这里的每一维直方图的大小要用指针作为参数,直方图范围要用指针的指针作为参数。
// 3、计算图像scr的直方图
cvCalcHist(&scr, pcvHistogram);
//4、创建直方图的图像
int nHistImageWidth = 255; //直方图图像宽度度
int nHistImageHeight = 150; //直方图图像高度
int nScale = 3; //宽度放大尺度
IplImage *pHistImage = cvCreateImage(cvSize(nHistImageWidth * nScale, nHistImageHeight), IPL_DEPTH_8U, 1); //创建显示直方图的空图像
cvRectangle(pHistImage, cvPoint(0, 0), cvPoint(pHistImage->width,pHistImage->height), CV_RGB(255, 255, 255), CV_FILLED);
//将创建的显示直方图的空图像填充为白色。cvRectangle 绘制简单、指定粗细或者带填充的 矩形
//5、绘制直方图
//5.1 统计直方图中的最大直方块
float fMaxHistValue = 0;
cvGetMinMaxHistValue(pcvHistogram, NULL, &fMaxHistValue, NULL, NULL); //该函数可以统计直方图中的最大、小直方块,可以返回值和地址。
//5.2 分别将每个直方块的值绘制到直方图中
int i;
for(i = 0; i < nHistImageWidth; i++)
{
float fHistValue = cvQueryHistValue_1D(pcvHistogram, i); //读取一维直方图中像素序号为i的直方块大小
int nRealHeight = cvRound((fHistValue / fMaxHistValue) * nHistImageHeight);
//每个直方块要绘制的实际高度。int cvRound (double value) 对一个double型的数进行四舍五入,并返回一个整型数!
cvRectangle(pHistImage,
cvPoint(i * nScale, nHistImageHeight - 1), //矩形的起点
cvPoint((i + 1) * nScale - 1, nHistImageHeight - nRealHeight),//矩形中起点斜对角先的另一端
cvScalar(i, 0, 0, 0),
CV_FILLED
);
}
/*//直接对图像进行直方图均衡化
IplImage*dst=cvCreateImage(cvGetSize(scr),8,1);
cvEqualizeHist(scr,dst);
cvNamedWindow("直方图均衡化",CV_WINDOW_AUTOSIZE);
cvShowImage("直方图均衡化",dst);
*/
//6、显示原始图像 以及直方图
cvNamedWindow("原图", CV_WINDOW_AUTOSIZE);
cvNamedWindow("直方图", CV_WINDOW_AUTOSIZE);
cvShowImage("原图", scr);
cvShowImage("直方图", pHistImage);
cvWaitKey(0);
//7、释放内存空间
cvReleaseHist(&pcvHistogram);
cvReleaseImage(&scr);
cvReleaseImage(&pHistImage);
cvDestroyAllWindows();
}
#include"highgui.h"
int main()
{
//1、先读取一副单通道图像
IplImage*scr=cvLoadImage("C:\\111.jpg",0);
//2、创建一个直方图结果,为下面计算图像的直方图做准备。
int dims=1;
int nHistSize = 256;
float fRange[] = {0, 255};
float *pfRanges[] = {fRange}; //这里的pfRanges 是一个指针,他指向一个数组,数组中包含的元素是指针。
//灰度级的范围 一个数组,数组的名就是一个常指针,把这个指针放到一个数组中,就形成了指针数组,
//那么这个数组的名字还是一个指针,只是这个指针指向了包含了指针的数组的首地址,所以说该指针也就是指针的指针。
//指针数组:储存了指针的数组;数组指针,指向数组的指针。
CvHistogram *pcvHistogram = cvCreateHist(dims, &nHistSize, CV_HIST_ARRAY, pfRanges);
//(直方图维数,维数尺寸的数组,直方图的表示格式CV_HIST_ARRAY 多维密集数组 CV_HIST_TREE 多维稀疏数组,图中方块范围的数组,归一化标识)
// 这里设置维数是多少,那么nHistSize的维数就是多少,每一维就代表对应维数的直方图的大小。
//例如:我建立一个二维直方图,每个直方图的大小为128,256。那么dims=2,nHistSize[] = {128,256}
//注意:这里的每一维直方图的大小要用指针作为参数,直方图范围要用指针的指针作为参数。
// 3、计算图像scr的直方图
cvCalcHist(&scr, pcvHistogram);
//4、创建直方图的图像
int nHistImageWidth = 255; //直方图图像宽度度
int nHistImageHeight = 150; //直方图图像高度
int nScale = 3; //宽度放大尺度
IplImage *pHistImage = cvCreateImage(cvSize(nHistImageWidth * nScale, nHistImageHeight), IPL_DEPTH_8U, 1); //创建显示直方图的空图像
cvRectangle(pHistImage, cvPoint(0, 0), cvPoint(pHistImage->width,pHistImage->height), CV_RGB(255, 255, 255), CV_FILLED);
//将创建的显示直方图的空图像填充为白色。cvRectangle 绘制简单、指定粗细或者带填充的 矩形
//5、绘制直方图
//5.1 统计直方图中的最大直方块
float fMaxHistValue = 0;
cvGetMinMaxHistValue(pcvHistogram, NULL, &fMaxHistValue, NULL, NULL); //该函数可以统计直方图中的最大、小直方块,可以返回值和地址。
//5.2 分别将每个直方块的值绘制到直方图中
int i;
for(i = 0; i < nHistImageWidth; i++)
{
float fHistValue = cvQueryHistValue_1D(pcvHistogram, i); //读取一维直方图中像素序号为i的直方块大小
int nRealHeight = cvRound((fHistValue / fMaxHistValue) * nHistImageHeight);
//每个直方块要绘制的实际高度。int cvRound (double value) 对一个double型的数进行四舍五入,并返回一个整型数!
cvRectangle(pHistImage,
cvPoint(i * nScale, nHistImageHeight - 1), //矩形的起点
cvPoint((i + 1) * nScale - 1, nHistImageHeight - nRealHeight),//矩形中起点斜对角先的另一端
cvScalar(i, 0, 0, 0),
CV_FILLED
);
}
/*//直接对图像进行直方图均衡化
IplImage*dst=cvCreateImage(cvGetSize(scr),8,1);
cvEqualizeHist(scr,dst);
cvNamedWindow("直方图均衡化",CV_WINDOW_AUTOSIZE);
cvShowImage("直方图均衡化",dst);
*/
//6、显示原始图像 以及直方图
cvNamedWindow("原图", CV_WINDOW_AUTOSIZE);
cvNamedWindow("直方图", CV_WINDOW_AUTOSIZE);
cvShowImage("原图", scr);
cvShowImage("直方图", pHistImage);
cvWaitKey(0);
//7、释放内存空间
cvReleaseHist(&pcvHistogram);
cvReleaseImage(&scr);
cvReleaseImage(&pHistImage);
cvDestroyAllWindows();
}
相关文章推荐
- OpenCV-绘制图像的像素直方图-Histogram
- OpenCV入门(二十一)-- 绘制彩色图像的直方图
- 【OpenCV3图像处理】统计图像的直方图 ,绘制直方图
- 【OpenCV】绘制图像的直方图
- opencv学习之(五)-直方图计算和绘制图像直方图
- opencv学习之(五)-直方图计算和绘制图像直方图
- OpenCV:绘制图像的BGR三通道直方图
- opencv-python绘制图像颜色直方图
- OpenCV绘制图像的水平和竖直方向直方图
- OpenCV 2 学习笔记(15): 绘制图像直方图
- opencv 绘制图像直方图
- Opencv绘制灰度/彩色图像的直方图及直方图的均衡化实例及源代码
- Opencv学习笔记——绘制图像的像素直方图
- OpenCV之单通道图像的直方图绘制
- OpenCV绘制图像中RGB三个通道的直方图
- opencv 图像直方图绘制
- OpenCV绘制图像的水平和竖直方向直方图
- opencv图像直方图的计算及绘制
- OpenCV成长之路:图像直方图的应用
- opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像