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

从已知的图片例lena中通过C程序获取图片的灰度值矩阵... 从已知的图片例lena中通过C程序获取图片的灰度值矩阵 展开
 我来答
jianmrright47
2015-10-02 · TA获得超过1.3万个赞
知道小有建树答主
回答量:1547
采纳率:81%
帮助的人:421万
展开全部
  • 方法一:

  • #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=0;i<(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=0;j<256;j++)  //将结果输出到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=0;i<(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=0;j<256;j++) //将结果输出到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;


    }
流浪的稻穗
2011-12-26 · TA获得超过130个赞
知道答主
回答量:42
采纳率:0%
帮助的人:33.2万
展开全部
我只能告诉你,在MATLAB中可以,imread函数,纯粹的C语言不知道可以不可以,.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
汪好帅
推荐于2016-08-01 · TA获得超过2830个赞
知道大有可为答主
回答量:1177
采纳率:0%
帮助的人:1415万
展开全部
谈下具体的思路。实现过程相信LZ自己完成。

首先要了解bmp位图的格式,搜索些技术支持文档,
bmp位图基本上是分4大部分,文件信息结果部分,文件头信息结果部分,调色板结果部分,后面就是数据实体部分。及其每个部分对应有用的信息。比如长宽。当然长宽信息你自己可以从window系统下看得到。

打开bmp文件,把前面三部分的字节总数给固定下来,逐个字符读取,然后读取数据实体部分。
输出就可以了。具体会遇到一些细节问题,后续有问题可追问。
追问
谢谢你的建议!
我还想问一下,在Linux的C下有读取图片和视频的库函数吗?我知道在matlab中有aviread()、imread()等库函数,不知C中是否也有相应的子函数。我从网上找了一些读取图片的C代码,但是还是希望有专业的库函数。
追答
这个我真不大了解。一般所用到的都是第三方图形库函数。比如opengL,opencv,等等的
如果,你Linux下用C编程写出了TC里面的汽车模拟小动画什么的程序,不妨分享一样哦!
O(∩_∩)O哈!
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式