图像直方图显示VC++代码 int getHistogram1DImage(IplImage * pImgGray) { int histSize=255; //直方图针数 float range0[]={0,256}; //第0维数值变化范围 float * ranges[]={range0}; //第1维数值变化范围 int i,binW; //下标号 float maxValue,minValue; //直方图数值的max和min int minIdx=0,maxIdx=0; //对应上述值时的下标号 double mean=0,variance=0; //均值和方差 ### 直方图显示程序知识点解析 #### 一、直方图基本概念 直方图是一种统计图表,用于表示连续数据分布情况。在图像处理领域,直方图主要用于描述图像中像素强度分布的情况,通常是对灰度图像进行分析。通过直方图可以直观地看出图像的亮度分布特征,例如是否存在过亮或过暗的情况。 #### 二、函数`getHistogram1DImage`详解 本函数主要功能是计算并显示一张灰度图像的直方图,并获取该直方图的一些关键统计指标。 ##### 2.1 函数参数 - `IplImage * pImgGray`: 输入的灰度图像指针。 ##### 2.2 变量定义与初始化 1. **直方图尺寸**:`int histSize = 255;` 表示直方图包含的桶(bin)的数量为256个(0到255)。 2. **数值范围**:`float range0[] = {0, 256};` 定义了每个桶覆盖的灰度级范围,即0到255。 3. **直方图数组**:`float * ranges[] = {range0};` 定义了直方图数值的变化范围。 4. **其他变量**: - `int i, binW;` 分别代表循环变量和每个桶的宽度。 - `float maxValue, minValue;` 存储直方图的最大值和最小值。 - `int minIdx = 0, maxIdx = 0;` 存储最大值和最小值对应的桶编号。 - `double mean = 0, variance = 0;` 存储直方图的均值和方差。 ##### 2.3 直方图创建与计算 1. **创建直方图图像**:`IplImage * histImg = cvCreateImage(cvGetSize(pImgGray), IPL_DEPTH_8U, 1);` 创建一个与原图像大小相同但只有一通道的新图像,用于绘制直方图。 2. **创建直方图对象**:`CvHistogram * hist = cvCreateHist(1, &histSize, CV_HIST_ARRAY, ranges, 1);` 创建一个一维直方图对象,指定桶的数量、类型、数值范围等信息。 3. **计算直方图**:`cvCalcHist(&pImgGray, hist, 0, NULL);` 计算输入图像的直方图。 4. **获取直方图最大最小值**:`cvGetMinMaxHistValue(hist, &minValue, &maxValue, &minIdx, &maxIdx);` 获取直方图的最大值、最小值以及对应的桶编号。 5. **缩放直方图**:为了更好地可视化,将直方图的值缩放到`histImg`的高度范围内。 6. **绘制直方图**:循环遍历每一个桶,根据桶的值绘制相应的矩形。这里使用`cvRectangle`函数来绘制。 ##### 2.4 统计指标计算 1. **均值计算**:遍历所有桶,累加桶值,然后除以桶总数(`histSize`),得到均值。 2. **方差计算**:再次遍历所有桶,累加每个桶值与均值之差的平方,最后除以桶总数,得到方差。 3. **标准差计算**:通过方差开方得到标准差。 ##### 2.5 输出结果 1. **打印统计信息**:输出均值、方差、标准差以及最大最小值及其对应的桶编号。 2. **显示图像**:使用`cvShowImage`函数显示原始灰度图像和绘制好的直方图。 3. **保存直方图图像**:使用`cvSaveImage`函数保存直方图图像。 #### 三、总结 此段代码实现了一个完整的灰度图像直方图计算和显示过程,包括直方图的创建、计算、统计指标的提取及图像的显示和保存。通过对这些步骤的理解,可以帮助我们更好地掌握图像处理中的直方图分析技术。
{
int histSize=255; //直方图针数
float range0[]={0,256}; //第0维数值变化范围
float * ranges[]={range0}; //第1维数值变化范围
int i,binW; //下标号
float maxValue,minValue; //直方图数值的max和min
int minIdx=0,maxIdx=0; //对应上述值时的下标号
double mean=0,variance=0; //均值和方差
// CvRect rect=cvRect(0,0,256,256);
// cvSetImageROI(pImgGray,rect); //设置ROI
IplImage * histImg=cvCreateImage(cvGetSize(pImgGray),IPL_DEPTH_8U,1);//用于存放直方图
CvHistogram * hist=cvCreateHist(1,&histSize,CV_HIST_ARRAY,ranges,1);//创建一张一维直方图的“图”,横坐标为灰度级,纵坐标为像素个数(*scale)
cvCalcHist(&pImgGray,hist,0,NULL);//计算直方图
cvGetMinMaxHistValue(hist,&minValue,&maxValue,&minIdx,&maxIdx);//得到最大最小值及其标号,最大值即在某处标号处像素的最大个数
//缩放最大值最小值以溶入图像
cvScale(hist->bins,hist->bins,((double)histImg->height)/maxValue,0);
cvSet(histImg,cvScalar(255),0);
binW=cvRound((double)histImg->width/histSize);// 对一个double型的数进行四舍五入,并返回一个整型数!
//把直方图画到图像中
for (i=0;i<histSize;i++)
{
cvRectangle(histImg,cvPoint(i*binW,histImg->height), cvPoint((i+1)*binW,histImg->height-cvRound(cvGetReal1D(hist->bins, i))),
//过对角线上的两个顶点绘制简单、指定粗细或者带填充的矩形,cvGetReal1D返回单通道数组的指定元素
cvScalarAll(0),-1,8,0);
float * bins=cvGetHistValue_1D(hist,i);//像素i的概率 即灰度是i的像素个数
mean+=bins[0];
}
- 粉丝: 0
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助