Почему в Grayscale Image есть желтые компоненты? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть следующее изображение

JPEG image

Я хотел преобразовать его в изображение в градациях серого со следующим кодом.

class Pixel {
private:
    double c[4];
public:
    double  Luminance(void) const {
        // Return luminance
        return 0.30 * c[0] + 0.59 * c[1] + 0.11 * c[2];
    }

    void SetRed(double red) {
        // Set red component
        c[0] = red;
    }

    void SetGreen(double green) {
        // Set green component
        c[1] = green;
    }

    void SetBlue(double blue) {
        c[2] = blue;
    }

    void SetAlpha(double alpha) {
        // Set alpha component
        c[3] = alpha;
    }
};

class Image {
private:
    R2Pixel *pixels;
    int npixels;
    int width;
    int height;
public:
    void BlackAndWhite(void) {  
        // Replace each pixel with its luminance value
        // Put this in each channel,  so the result is grayscale
        for (int i = 0; i < this->npixels; i++) {
            auto luminance = pixels[i].Luminance();
            pixels[i].SetRed(luminance);
            pixels[i].SetGreen(luminance);
            pixels[i].SetRed(luminance);
        }
    }
};

В обоих классах есть больше методов, которые я не использовал для краткости.Основными методами интересов являются Pixel :: Luminance () и Image :: BlackAndWhite ().Как рассчитывается Luminace (), я ожидал, что результат будет в градациях серого изображения.Это не тот случай, хотя.На самом деле, даже если я установлю значение каждого из каналов Red, Green и Blue на 1, изображение не станет полностью белым.Вместо этого это выглядит как-то ниже

Yellow Image after converting it to grayscale

Я не уверен, что мне здесь не хватает.Любые указатели будут оценены.Кроме того, дайте мне знать, если кто-то думает, что для понимания вопроса требуется добавление дополнительного кода.

Спасибо.

...