方法一:
#include<stdio.h>#include<stdlib.h>
void main()
{
int i,j
FILE *fp //指向文件的指针
fp=fopen("Lena.raw","rb") //打开文件。注意raw格式图像要以只读二进制流的形式打开
if(!fp)
{
printf("ERROR!\n")
}
unsigned char *pData=new unsigned char[256*256] //注意:raw图像用无符号char型读入
fread(pData,sizeof(unsigned char),(256*256),fp) //fread具体用法见msdn
fclose(fp) //取消fp指针指向
int value[256]={0} //声明并初始化存灰度值的数组
for(i=0i<(256*256)i++) //统计灰度值
{
value[pData[i]]++
}
printf("灰度值\t\t大小") //
printf("\n")
fp=fopen("result.txt","wb")
fprintf(fp,"灰度值\t\t大小\r\n")//注意\r\n 否则不能换行!
for(j=0j<256j++) //将结果输出到txt中
{
printf("%d\t\t%d\n",j,value[j])
// fwrite(value,sizeof(int),256,fp)
fprintf(fp,"%d\t\t%d\r\n",j,value[j]) //注意\r\n 否则不能换行
}
delete[] pData//删除空间
fclose(fp) //关闭txt文件
}
方法二:
#include<stdio.h>#include<stdlib.h>
int value[256]={0}
int fread(unsigned char *pData) //把声明的那个数组空间指针作为参数来回传
{
FILE *fp
fp=fopen("Lena.raw","rb")
if(!fp)
{
printf("Read ERROR!\n")
}
fread(pData,sizeof(unsigned char),(256*256),fp)
fclose(fp)
return 0 //
}
int fchuli(unsigned char *pData)
{
for(int i=0i<(256*256)i++) //统计灰度值
{
value[pData[i]]++
}
return 0 //
}
int fwrite(unsigned char *pData)
{
FILE *fp
fp=fopen("result.txt","wb")
fprintf(fp,"灰度值\t\t大小\r\n")
for(int j=0j<256j++) //将结果输出到txt中
{
printf("%d\t\t%d\n",j,value[j])
// fwrite(value,sizeof(int),256,fp)
fprintf(fp,"%d\t\t%d\r\n",j,value[j])
}
delete[] pData//删除空间
fclose(fp) //关闭txt文件
return value[256] //
}
int main(unsigned char *pData)
{
pData=new unsigned char[256*256] //在主函数里声明新空间
fread(pData) //传数组地址
fchuli(pData)
fwrite(pData)
return 0
}
参考一下这个程序:#define IMAGEWIDTH 80
#define IMAGEHEIGHT 80
void Histogram(unsigned char *pImage,int nWidth,int nHeight,float fHisto[256])
void Enhance(unsigned char *pImage,unsigned char *pImage1,int nWidth,int nHeight,float fHisto[256],float fHisto1[256])
unsigned char dbImage[IMAGEWIDTH*IMAGEHEIGHT]
unsigned char dbTargetImage[IMAGEWIDTH*IMAGEHEIGHT]
float fHistogram[256],fHistogram1[256]
unsigned char lut[256]
/* 直方图统计程序 */
int main()
{
... //准备一幅灰度图片到dbImage
Histogram(dbImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram)//做直方图统计
Enhance(dbImage,dbTargetImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram,fHistogram1)//直方图增强输出到dbTargetImage
...//完成后显示
}
void Histogram(unsigned char *pImage,int nWidth,int nHeight,float fHisto[256])
{
int i,j
unsigned int uWork
unsigned char *pWork
for ( i=0i<256i++ )fHisto[i]=0.0f
pWork=pImage
for ( i=0i<nHeighti++ )
{
for ( j=0j<nWidthj++,pWork++ )
{
uWork=(unsigned int)(*pWork)
fHisto[uWork]++
}
}
uWork=nWidth*nHeight
for ( i=0i<256i++ )
{
fHisto[i]/=uWork
fHisto[i]*=100
}
}
void Enhance(unsigned char *pImage,unsigned char *pImage1,int nWidth,int nHeight,float fHisto[256],float fHisto1[256])
{
int i,j
unsigned int uWork
unsigned char *pWork,*pWork1
for ( i=0i<256i++ )
fHisto1[i]=fHisto[i]/100
for ( i=1i<256i++ )
fHisto1[i]+=fHisto1[i-1]
for ( i=0i<256i++ )
lut[i]=fHisto1[i]*256
for ( i=0i<256i++ )
if ( lut[i]>=256 )
lut[i]=255
pWork=pImagepWork1=pImage1
for ( i=0i<nHeighti++ )
for ( j=0j<nWidthj++,pWork++,pWork1++ )
(*pWork1)=lut[(*pWork)]
}
1、可以变成灰度图也可以不变。这里假设你的图像都是IPL_DEPTH_8U类型。2、如果变成灰度图,就是单通道图像,获取的就是每一个像素点的灰度值。
IplImage* img = cvLoadImage("test.bmp", 0)
for (int i = 0i <img->heighti++)
{
for (int j = 0j <img->widthj++)
{
//方法一:使用cvGet2D()函数间接访问
CvScalar s = cvGet2D(img, i, j) //其中i代表y轴(第i行),即height;j代表x轴(第j列),即width。
printf("gray value=%f\n",s.val[0])
//方法二:使用直接访问
uchar val = ((uchar *)(img->imageData + i*img->widthStep))[j] //i和j的意义同上
printf("gray value=%d\n",val)
}
}
3、如果不变成灰度图,就是3通道图像,获取的就是每一个像素点的BGR值,然后分别获取B值,G值和R值。
IplImage* img = cvLoadImage("test.bmp", 1)
for (int i = 0i <img->heighti++)
{
for (int j = 0j <img->widthj++)
{
//方法一:使用cvGet2D()函数间接访问
CvScalar s=cvGet2D(img,i,j)//其中i代表y轴(第i行),即height;j代表x轴(第j列),即width。
printf("B=%f, G=%f, R=%f\n",s.val[0],s.val[1],s.val[2]) //注意是BGR顺序
//方法二:使用直接访问
int bVal = ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]// B
int gVal = ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]// G
int rVal = ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]// R
printf("B=%d, G=%d, R=%d\n",bVal,gVal,rVal) //注意是BGR顺序
}
}