PGM格式的p5类型的双字节存储的读取操作,关于CV的第一篇博客,敬请指教

该文章是本人原创,可以转发分享,但希望标注本原创的链接,谢谢!

关于PGM/PPM格式的描述文章很多,因此,基本知识咱就不多说了。只是关于p5类型的双字节的描述太少,我没有搜到,基于一些零碎的信息,对GPM格式的P5类型的双字节存储予以代码实现。

以下的代码可以正确运行的。

#include <cv.h>
#include <opencv2/highgui.hpp>
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <fstream>

using namespace std;

#define HEADER_MAXLINE 1024

// 从文件读取PPM图片
void pgm_load(string filename, unsigned char* out_data, int* w, int* h)
{
    char header[1024];
    FILE* fp = NULL;
    int line = 0;
    unsigned char tmpData1, tmpData2;

    fp = fopen(filename.c_str(), "rb");

    // 读取图片格式(例如:"P5")
    // 高宽在第二行非注释数据
    while(line < 2){    
        fgets(header, 1024, fp);
        if(header[0] != '#'){
            ++line;
        }   
    }   
    // 读取宽高
    sscanf(header,"%d %d\n", w, h);

    printf("w %d, h %d\n", *w, *h);

    // 获取最大像素值
    fgets(header, 20, fp);//如果最大像素值为65535,则是双字节存储的

int  maxValue = 0;

    sscanf(header,"%d", &maxValue);
    printf("max value %d\n", maxValue);

    // get rgb data
    //fread(out_data, (*w)*(*h)*3, 1, fp);
    fread(out_data, (*w)*(*h)*2, 1, fp);//这里一个像素对应于2个字节的;

    fclose(fp);
}

int main()
{
    int w = 0, h = 0;
    string fileName = "./1.pgm";

    unsigned char outdata1[640*480*2];
    unsigned short outdata3[640*480];
    unsigned char outdata2[640*480*1];
    unsigned short valueMax = 0;

   pgm_load(fileName, outdata1, &w, &h );

    for(int i = 0; i < 640*480; i++)
    {
        outdata3[i] = (unsigned short)(outdata1[i*2]<<8) + outdata1[i*2+1];

        if(outdata3[i] > valueMax)
        {
          valueMax = outdata3[i];
        }
    }
    for(int i = 0; i < 640*480; i++)
    {
        outdata2[i] = outdata3[i]*255/valueMax;
    }

    cv::Mat src1(h, w, CV_8UC1, outdata2);
    cv::imwrite("./aa.jpg", src1);


   return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值