C ++ / CImg противоречивые результаты - PullRequest
0 голосов
/ 02 апреля 2012

Ниже у меня есть простая программа, которая использует библиотеку CImg (http://cimg.sourceforge.net/), которая перебирает пиксели изображения и выводит 0 или 1 для каждого пикселя в зависимости от значения оттенков серого (светлого или темного).странно, что я получаю разные результаты каждый раз, когда я запускаю программу (с одним и тем же вводом).

Если я делаю

image.display()

, она работает как положено, поэтому кажется, что CImgчтение изображения правильно. Однако, если я пытаюсь напечатать AvgVal во внутреннем цикле for, я каждый раз получаю разные значения. Я использую 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 Ответ

1 голос
/ 02 апреля 2012

Если ваш входной файл .png является полутоновым (только один канал, как это разрешено форматом .png), то, вероятно, вашим Gval и Bval назначаются случайные значения, полученные из недопустимого доступа к памяти.Как следствие, ваш AvgVal может быть неправильным, и получающееся изображение может отличаться при каждом запуске программы.

...