1

PPM 画像を保存する非常に単純な関数があります。

void WriteCImage(CImage *cimg, char *filename)
{
    FILE *fp;
    int i,n;

    fp = fopen(filename,"w");
    fprintf(fp,"P6\n");
    fprintf(fp,"%d %d\n",cimg->C[0]->ncols,cimg->C[0]->nrows);
    fprintf(fp,"255\n"); 
    n = cimg->C[0]->ncols*cimg->C[0]->nrows;
    for (i=0; i < n; i++) 
    {
        fputc(cimg->C[0]->val[i],fp);
        fputc(cimg->C[1]->val[i],fp);
        fputc(cimg->C[2]->val[i],fp);
    }
    fclose(fp);
}

ご覧のとおり、この関数はマトリックス (CImage 形式) を受け取り、画像データを ASCII ファイルに書き込みます。正しいようですが、グレースケール イメージを PPM イメージにコピーするたびに問題が発生します。コードを見てください:

//that's a PGM grayscale image
gt = ReadImage(argv[1]);

//creating an RGB image with same dimensions of the PGM image
nwcimg = CreateCImage(gt->nrows,gt->ncols);

n=gt->nrows*gt->ncols;

//iterate through the PGM image
for(index=0;index<n;index++)  
{
    // just a copy of the grayscale image value to all 3 layeres    
    //of the PPM (RGB) image    
    nwcimg->C[0]->val[index]=gt->val[index];
    nwcimg->C[1]->val[index]=gt->val[index];
    nwcimg->C[2]->val[index]=gt->val[index];
}


WriteCImage(nwcimg,"gt-copied.ppm"); 
DestroyCImage(&nwcimg);
DestroyImage(&gt);

私にはどんな問題がありますか?まあ、コードは正しくて単純なようです。しかし、cimage 行列/ベクトルがファイルとして書き込まれると、2 つの画像が同じではないことがわかります。コピーされた画像では、PGM 画像のピクセルが「シフト」または「ミラーリング」されているようです。

イメージ ファイルRGB コピーが表示されます。

4

1 に答える 1