Проблемы с фильтром CS50 Pset4, эффект размытия - PullRequest
0 голосов
/ 05 августа 2020
#include "helpers.h"
#include <math.h>
 
// Convert image to grayscale
void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
    int total = 0;
    float avg = 0;
 
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            total = image[i][j].rgbtRed + image[i][j].rgbtGreen + image[i][j].rgbtBlue;
            avg = total / 3.00;
            image[i][j].rgbtRed = round(avg);
            image[i][j].rgbtGreen = round(avg);
            image[i][j].rgbtBlue = round(avg);
        }
    }
    return;
}
 
// Convert image to sepia
void sepia(int height, int width, RGBTRIPLE image[height][width])
{
    float sepia_red = 0;
    float sepia_green = 0;
    float sepia_blue = 0;
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            sepia_red = (.393 * image[i][j].rgbtRed + .769 * image[i][j].rgbtGreen + .189 * image[i][j].rgbtBlue);
            sepia_green = (.349*image[i][j].rgbtRed) + (.686*image[i][j].rgbtGreen) + (.168*image[i][j].rgbtBlue);
            sepia_blue = (.272*image[i][j].rgbtRed) + (.534*image[i][j].rgbtGreen) + (.131*image[i][j].rgbtBlue);
 
            if (sepia_red > 255)
            {
                sepia_red = 255;
            }
            if (sepia_green > 255)
            {
                sepia_green = 255;
            }
            if (sepia_blue > 255)
            {
                sepia_blue = 255;
            }
            image[i][j].rgbtRed = round(sepia_red);
            image[i][j].rgbtGreen = round(sepia_green);
            image[i][j].rgbtBlue = round(sepia_blue);
        }
    }
    return;
}
 
// Reflect image horizontally
void reflect(int height, int width, RGBTRIPLE image[height][width])
{
    int temp[3];
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width/2; j ++)
        {
            temp[0] = image[i][j].rgbtRed;
            temp[1] = image[i][j].rgbtGreen;
            temp[2] = image[i][j].rgbtBlue;
 
            image[i][j].rgbtRed = image[i][width - j - 1].rgbtRed;
            image[i][j].rgbtGreen = image[i][width - j - 1].rgbtGreen;
            image[i][j].rgbtBlue = image[i][width - j - 1].rgbtBlue;
 
            image[i][width - j - 1].rgbtRed = temp[0];
            image[i][width - j - 1].rgbtGreen = temp[1];
            image[i][width - j - 1].rgbtBlue = temp[2];
        }
    }
    return;
}
 
// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width])
{
    int total = 0;
    float count = 0;
    int elements = 0;
 
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            for (int x = i - 1; x <= i + 1; x++)
            {
                if (x >= 0 && x <= height - 1)
                {
                    elements++;
                }
            }
            for (int y = j - 1; y <= j + 1; y++)
            {
                if (y >= 0 && y < width - 1)
                {
                    elements++;
                }
            }
 
            total = image[i][j].rgbtRed + image[i][j].rgbtGreen + image[i][j].rgbtBlue;
 
            count = total / elements;
 
            image[i][j].rgbtRed = round(count);
            image[i][j].rgbtGreen = round(count);
            image[i][j].rgbtBlue = round(count);
        }
    }
    return;
}

После нескольких сообщений на Reddit мне сказали, что мне нужно

  • создать временную переменную, а затем, как только она будет создана, go об изменении исходных пикселей на значение Для временной переменной
  • создайте переменную увеличения, такую ​​как (int pixels_used), чтобы разделить на

Я не знаю, как go об этом, деление на увеличивающуюся переменную проблемы меня, потому что я думаю, что мне нужно создать red_count, blue_count, green_count и pixels_used. Я попытался написать эту форму кода здесь https://pastebin.com/UX1miGtd, поскольку она похожа на пример, который Брайан дал нам на этом рисунке https://i.stack.imgur.com/K7rVL.png. Мы складываем общее количество красного, зеленого и синего, а затем назначаем выбранный пиксель этим числам. Очевидно, исходя из количества переменных, которые мне пришлось использовать, это выглядит не очень хорошо, и я предполагаю, что это неправильно, но у меня нет других идей.

Если кто-нибудь может помочь, я был бы очень признателен!

...