如何用C语言程序从bmp格式的图片中读取图片的灰度值?

Python018

如何用C语言程序从bmp格式的图片中读取图片的灰度值?,第1张

方法一:

#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顺序

}

}