Фильтр градаций серого для изображения в формате JPEG не округляет значения должным образом? - PullRequest
0 голосов
/ 02 марта 2020

Я делал фильтр в градациях серого для изображения, которое передается в виде структуры и является изображением [высота] [ширина]. Все значения работают, но по какой-то причине функция не округляется должным образом. Например, если значения RGB составляют 27 28 28, среднее значение должно быть 28, но вместо этого оно равно 27, поэтому оно копируется как 27 27 27. Почему?

// Convert image to grayscale
void grayscale(int height, int width, RGBTRIPLE image[height][width])
{

    for (int i = 0; i < height; i++)
    {
        for (int w = 0; w < width; w++)
        {

            float avg = ((image[i][w].rgbtRed + image[i][w].rgbtGreen + image[i][w].rgbtBlue) / 3);

            image[i][w].rgbtRed = round(avg);
            image[i][w].rgbtGreen = round(avg);
            image[i][w].rgbtBlue = round(avg);
        }
    }

    return;
}

1 Ответ

2 голосов
/ 02 марта 2020

предполагается, что ваше изображение имеет тип int или char:

float avg = ((image[i][w].rgbtRed + image[i][w].rgbtGreen + image[i][w].rgbtBlue) / 3);

код выше будет скомпилирован как

int temp = ((image[i][w].rgbtRed + image[i][w].rgbtGreen + image[i][w].rgbtBlue) / 3);
float avg = temp;

, а в C / C ++ деление int часто будет усекаться до нуля ', так что температура будет 27.

, вы можете использовать приведение типов для разделенного числа.

float avg = ((float)(image[i][w].rgbtRed + image[i][w].rgbtGreen + image[i][w].rgbtBlue) / 3);

проверьте этот ответ:

Каково поведение целочисленного деления?

...