2014-06-13 14 views
0

RGB 이미지를 GRAYSCALE 이미지로 변환하고 PGM 형식으로 저장하는 프로그램을 만들어야합니다. 나는 Devil 라이브러리를 사용하지만, 이미지를 저장할 때 항상 그레이 스케일에서 3D 이미지 (3 행렬)를 얻지 만, MATLAB에서로드하면 3 행렬이 아니라 1 행렬이됩니다. Devil을 사용하여 출력 파일에서 하나의 행렬을 얻으려면 어떻게해야합니까? PNM 수출의 버그로 인해DevIL 라이브러리 : 하나 대신 3 개의 행렬로 회색조 이미지 저장

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; 

} 불행하게도

답변

1

, 악마 만 PPM (휴대용 픽스 맙, 3 채널 RGB)에 관계없이 파일 확장자의 파일을 작성합니다 수 있습니다. 유일한 해결책은 PNG과 같은 단일 채널 그레이 스케일 이미지를 지원하는 다른 파일 형식을 사용하는 것입니다.

Matlab도이를 사용할 수 있어야합니다. PGM 형식의 파일이 절대적으로 필요하거나 필요하면 png2pnm과 같은 변환기를 사용해야합니다.