C ++ / CImg结果不一致

时间:2012-04-01 23:54:44

标签: c++ cimg

下面,我有一个简单的程序,它使用CImg库(http://cimg.sourceforge.net/),它迭代图像的像素,并根据其灰度值为每个像素输出0或1 (光明或黑暗)很奇怪的是,每次运行程序时都会得到不同的结果(使用相同的输入)。

如果我这样做

image.display()

它按预期工作,所以CImg似乎正在正确地读取图像。但是,如果我尝试在内部for循环中打印AvgVal,每次都会得到不同的值。我正在使用OSX 10.7.3和gcc 4.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;
}

我已经阅读了一段时间,但我刚注册,所以我无法发布我正在使用的示例图像。我只是描述它们 - 它们是包含黑白图案的10px x 10px png图像,使用Photoshop CS5编写。

1 个答案:

答案 0 :(得分:1)

如果您的输入.png文件是灰度级文件(仅限一个通道,因为.png格式允许),那么可能会为您的Gval和Bval分配从无效内存访问中获取的随机值。因此,您的AvgVal可能有误,每次运行程序时生成的图像可能会有所不同。