0

以下に、CImgライブラリ(http://cimg.sourceforge.net/)を使用する簡単なプログラムがあります。このプログラムは、画像のピクセルを反復処理し、グレースケール値(ライトまたは闇)。非常に奇妙なのは、(同じ入力で)プログラムを実行するたびに異なる結果が得られることです。

私が行った場合

image.display()

期待どおりに動作するため、CImgは画像を正しく読み取っているようです。ただし、内側のforループでAvgValを出力しようとすると、毎回異なる値が取得されます。違いがあれば、OSX10.7.3とgcc4.2.1を使用しています。

#include <iostream>
#include <fstream>
#include <stdexcept>
#include "CImg-1.4.9/CImg.h"
using namespace cimg_library;

int main(int argc, char *argv[]) {
    if (argc != 3) {
        std::cout << "Usage: acepp inputfile outputfile" << std::endl;
    }

    else {
        std::ofstream outputFile(argv[2]);
        if (!outputFile.is_open()) throw std::runtime_error("error: cannot open file for writing");

        CImg<unsigned char> image(argv[1]);
        int RVal, GVal, BVal, AvgVal, outBit;
        for (int iHeight = 0; iHeight < image.height(); iHeight++) {
            for (int iWidth = 0; iWidth < image.width(); iWidth++) {
                RVal = image(iWidth,iHeight,0,0);
                GVal = image(iWidth,iHeight,0,1);
                BVal = image(iWidth,iHeight,0,2);
                AvgVal = (RVal + GVal + BVal) / 3;
                outBit = 1;
                if (AvgVal > 127) outBit = 0; // low is dark, high is light
                outputFile << outBit;
            }
            outputFile << std::endl;
        }
        outputFile.close();
        std::cout << "Done writing to: " << argv[2] << std::endl;
    }

    return 0;
}

しばらくSOを読んでいますが、登録したばかりなので、使用しているサンプル画像を投稿できません。それらについて説明します。これらは、PhotoshopCS5を使用して作成された黒と白のパターンを含む10pxx10pxpng画像でした。

4

1 に答える 1

2

入力.pngファイルがグレースケールファイル(.png形式で許可されているため、1つのチャネルのみ)の場合、おそらく、GvalとBvalには、無効なメモリアクセスから取得したランダムな値が割り当てられます。結果として、AvgValが間違っている可能性があり、プログラムを実行するたびに結果の画像が異なる可能性があります。

于 2012-04-02T08:05:29.553 に答える