C++ 恶魔库:将灰度图像保存为三个矩阵,而不是一个矩阵

C++ 恶魔库:将灰度图像保存为三个矩阵,而不是一个矩阵,c++,grayscale,pgm,devil,C++,Grayscale,Pgm,Devil,我需要做一个程序,将RGB图像转换为灰度图像,并将其保存为PGM格式。我使用DevIL library,但是当我保存图像时,我总是获得一个灰度的3D图像(3个矩阵),但是,如果我在MATLAB中加载它,我有3个矩阵,而不是一个矩阵。如何使用DevIL在输出文件中仅获取一个矩阵 int main() { ilInit(); ilEnable(IL_ORIGIN_SET); ilOriginFunc(IL_ORIGIN_UPPER_LEFT); ilEnable(IL_FILE

我需要做一个程序,将RGB图像转换为灰度图像,并将其保存为PGM格式。我使用DevIL library,但是当我保存图像时,我总是获得一个灰度的3D图像(3个矩阵),但是,如果我在MATLAB中加载它,我有3个矩阵,而不是一个矩阵。如何使用DevIL在输出文件中仅获取一个矩阵

 int main()
 {

  ilInit();
  ilEnable(IL_ORIGIN_SET);
  ilOriginFunc(IL_ORIGIN_UPPER_LEFT);
  ilEnable(IL_FILE_OVERWRITE);

  ILuint ImageName; // The image name to return.
  ilGenImages(1, &ImageName);
  ilBindImage(ImageName);
  if(!ilLoadImage("/home/andrea/Scrivania/tests/siftDemoV4/et000.jpg"))
  {   printf("err");
      exit;
  }
  else
    printf("caricata\n");

  ILuint width,height;
  width = ilGetInteger(IL_IMAGE_WIDTH);
  height = ilGetInteger(IL_IMAGE_HEIGHT);
  double v[3]={0.2989360212937755001405548682669177651405334472656250000,0.5870430744511212495240215503145009279251098632812500000,0.1140209042551033058465748126764083281159400939941406250};
 printf("%.55f %.55f %.55f",v[0],v[1],v[2]);
ILubyte *imgValue=ilGetData();
int i=0;
ILubyte imgNuova[width*height];


while( i < width*height)
{


        imgNuova[i]=(char)round( ( (double)imgValue[3*i]*v[0])+ ( (double)imgValue[3*i+1]*v[1])+((double)imgValue[3*i+2]*v[2]));

        i++;

}


ILuint ImageName2;

ilGenImages(2, &ImageName2);
ilBindImage(ImageName2);
ilTexImage(width, height, 1, 1, IL_LUMINANCE,
           IL_UNSIGNED_BYTE, imgNuova);
iluFlipImage();
ilSave(IL_PNM,"/home/andrea/Scrivania/tests/siftDemoV4/et000new.pgm");

return 0;
intmain()
{
ilInit();
ilEnable(ILU原点集);
ilOriginFunc(左上角);
ilEnable(ILU文件覆盖);
ILuint ImageName;//要返回的图像名称。
ilGenImages(1,&ImageName);
ilBindImage(ImageName);
如果(!ilLoadImage(“/home/andrea/Scrivania/tests/siftDemoV4/et000.jpg”))
{printf(“err”);
出口
}
其他的
printf(“加勒比数据”);
i单元宽度、高度;
宽度=ilGetInteger(IL\u图像\u宽度);
高度=ilGetInteger(ILU图像高度);
双v[3]={0.2989360212937755001405548682669177651405334472656250000,0.5870430744511212495240215503145009279251098632812500000,0.11402090425510330584574812676408381159400939941406250};
printf(“%.55f%.55f%.55f”,v[0],v[1],v[2]);
ILubyte*imgValue=ilGetData();
int i=0;
ILubyte imgNuova[宽度*高度];
而(i<宽度*高度)
{
imgNuova[i]=(char)round((双)imgValue[3*i]*v[0])+((双)imgValue[3*i+1]*v[1])+((双)imgValue[3*i+2]*v[2]);
i++;
}
ILuint-ImageName2;
ilGenImages(2和ImageName2);
ilBindImage(ImageName2);
ilTexImage(宽度、高度、1、1、亮度、,
无符号字节,imgNuova);
iluFlipImage();
ilSave(IL_PNM,“/home/andrea/Scrivania/tests/siftDemoV4/et000new.pgm”);
返回0;

}

不幸的是,由于PNM导出中的错误,DevIL可以并且将只写入PPM(便携式Pixmaps,3通道RGB)文件,而不管文件扩展名如何。唯一的解决方案是使用不同的文件格式,支持单通道灰度图像,如
PNG

Matlab也应该能够使用它。如果您绝对需要或想要使用
PGM
格式的文件,则必须使用类似
png2pnm
的转换器