Превратить изображение в оттенки серого - PullRequest
0 голосов
/ 04 октября 2019

Если в приведенном ниже фрагменте кода (внизу этого поста) мне нужно написать функцию, которая превратит BMP в градации серого, как мне поступить? Обратите внимание, что main программы уже написана, и в ней записаны все функции открытия / закрытия файлов и т. Д. - для этого просто нужна сама функция.

Мое назначение требует, чтобы для каждого пикселя значения красного, зеленого и синего были преобразованы в среднее значение из трех, чтобы они стали в некоторой степени оттенками серого, но я не знаю, как их начать.

Включены следующие библиотеки - опять же, обратите внимание, что это в отдельном файле:

#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>

Вот фрагмент кода, который я должен заполнить:

void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
    return;
}

Я поиграл с потенциальным решением ниже, но мое использование image[height][width], похоже, не работает. И тогда, конечно, мне нужно заменить 0x00 вычислением, которое обеспечивает среднее из трех. Но я не совсем уверен, как это улучшить.


{

    if(( image[height][width].rgbtRed==0xff && image[height][width].rgbtBlue==0x00 && image[height][width].rgbtGreen==0x00)||(image[height][width].rgbtRed==0xff && image[height][width].rgbtBlue==0xff && image[height][width].rgbtGreen==0xff)) 
    {
        image[height][width].rgbtRed=0x00;
        image[height][width].rgbtBlue=0x00;
        image[height][width].rgbtGreen=0x00;
    }
    return;
}

(Я прошу прощения, если мой жаргоне ошибочен - я очень начинающий ученик.)

1 Ответ

1 голос
/ 04 октября 2019

Что вам нужно сделать, это рассчитать цвет для каждого пикселя, используя либо наивное среднее значение, формулу 0.299R + 0.587G + 0.114B, предложенную от @ Lee Daniel Crocker в комментариях или какой-то другой метод , затем установите для значений R G и B пикселей все одинаковые значения, и изображение будет серым.

Примерно так

void grayscale(int height, int width, RGBTRIPLE image[][]){
    for(int x=0; x<width ; x++){
        for(int y=0; y<height; y++){
            unsigned int colour = 0.299*image[x][y].rgbtRed + 0.587*image[x][y].rgbtGreen + 0.114*image[x][y].rgbtBlue;
            image[x][y].rgbtRed = colour & 0xFF;
            image[x][y].rgbtBlue = colour & 0xFF;
            image[x][y].rgbtGreen = colour & 0xFF;
         }
    }
}

Проверьте, не являются ли ваши типы данных неподписанными, чтобы вы не удивились, если подписанные байты испортят дополнения для значений более 127

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...