0

pgmファイル[ピクセルのマトリックス、行の設定、列の設定]を配列に取り、水平方向に反転して、再度出力しようとしています。これは私がそれを読んでいる方法です:

bool PgmPicture::readPgmFile(string inputFile)
{
    stringstream ss;
    string line = "";
    int magicNumber;
    ifstream pgmIn;
    pgmIn.open(inputFile.c_str());
if (pgmIn.fail()) { //makes sure that itemList opened okay.
    perror(inputFile.c_str());
    return false;
}
    getline(pgmIn,line);
    pgmIn >> numRows >> numCols >> magicNumber;
    for(int row = 0; row < numRows ; row++) {
    for (int col = 0; col < numCols  ; col++) {
        pgmIn >> picture[row][col]; //this array only contains pixel values, no headers or flags.
    }
}
return true;
}  

したがって、基本的に、図の 2 行目には行と列の 2 つの値が含まれます。たとえば、300 と 500 は、画像が 300 行 500 列であることを意味します。ご覧のとおり、上記の関数はその行を numRows と numCols に読み込んでいます。

後の関数では、ピクセルのペアを交換して画像を水平方向に反転しようとしています (たとえば、一番右のピクセルを最初のピクセルと交換し、一番右のピクセルから 1 を差し引いたものを最初のピクセル + 1 と交換します)。 )

これが私の機能です:

void PgmPicture::hflip(){
int tmp;
for(int row = 0; row < numRows  ; row++) {
    for (int col = 0; col < numCols  ; col++) {
            tmp = picture[row][col];
            picture[row][col] = picture[numRows - 1 - row][col];
            picture[numRows -1  - row][col] = tmp;
    }
  }
}

ここでこれの何が問題になっていますか?元の画像とまったく同じ画像を出力しているだけです。説明したように、行ごとに各要素を切り替える必要があります。皆さん、これを新鮮な目で見ていただけませんか?私はこれをしばらく追跡してきましたが、わかりません。

編集: コードを次のように変更しました:

int tmp;
for(int row = 0; row < numRows  ; row++) {
    for (int col = 0; col < numCols/2 ; col++) {
            tmp = picture[row][col];
            picture[row][col] = picture[row][numCols - 1 - col];
            picture[row][numCols - 1 - col] = tmp;
    }
}

そして、私は文字化けした混乱を得ています。これがオリジナルです: http://i493.photobucket.com/albums/rr294/Jamlegend/mammoth_zps31b72d88.png そしてここに後の写真があります: http://i493.photobucket.com/albums/rr294/Jamlegend/after_zpsdf1a8b40.png

4

5 に答える 5

0

このコード行から:

        tmp = picture[row][col];
        picture[row][col] = picture[numRows - 1 - row][col];
        picture[numRows -1  - row][col] = tmp;

私は言うでしょう:あなたは一番上のピクセルを一番下のピクセルと、一番上の1を一番下の1と交換しています。左のピクセルを右のピクセルと交換したいと言いました。行は次のようになります。

        tmp = picture[row][col];
        picture[row][col] = picture[row][numCols - 1 - col];
        picture[row][numCols - 1 - col] = tmp;

これを試してみてください。問題が解決する可能性があります。画像の上下が同じだから見えなかったのかな?画像処理コードがある場合は、ほとんどの場合、画像 (結果と入力) を含めることをお勧めします。

于 2014-11-19T20:59:56.450 に答える