Отражать pset4 CS50 - PullRequest
       10

Отражать pset4 CS50

0 голосов
/ 11 апреля 2020

Привет всем, кто сделал CS50,

В настоящее время я делаю фильтр pset4, размышляю и борюсь с написанным мной кодом. Он компилируется нормально, но изображение на выходе выглядит как тот, который я прикрепил. У меня есть подсказка, как я могу это исправить? (Если возможно, без решения; подсказка полностью подойдет :))

#include "helpers.h"
#include <stdio.h>
#include <math.h>

// Convert image to grayscale
void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
   for (int i = 0; i < (height - 1); i++)
   {
       for (int j = 0; j < (width - 1); j++)
       {
           //get the average
           float average = 0;
           average = (image[i][j].rgbtRed + image[i][j].rgbtGreen + image[i][j].rgbtBlue) / 3;

           //set color channels with the average value
           image[i][j].rgbtRed = round(average);
           image[i][j].rgbtGreen = round(average);
           image[i][j].rgbtBlue = round(average);
       }
   }
   return;
}

// Convert image to sepia
void sepia(int height, int width, RGBTRIPLE image[height][width])
{
   for (int i = 0; i < (height - 1); i++)
   {
       for (int j = 0; j < (width - 1); j++)
       {
           //calculate the new values
           float red = 0;
           float green = 0;
           float blue = 0;


           red = .393 * image[i][j].rgbtRed + .769 * image[i][j].rgbtGreen + .189 * image[i][j].rgbtBlue;
           if (round(red) > 255)
           {
               image[i][j].rgbtRed = 255;
           }
           else if (round(red <= 255))
           {
               image[i][j].rgbtRed = red;
           }

           green = .349 * image[i][j].rgbtRed + .686 * image[i][j].rgbtGreen + .168 * image[i][j].rgbtBlue;
           if (round(green) > 255)
           {
               image[i][j].rgbtGreen = 255;
           }
           else if (round(green) <= 255)
           {
               image[i][j].rgbtGreen = green;
           }

           blue = .272 * image[i][j].rgbtRed + .534 * image[i][j].rgbtGreen + .131 * image[i][j].rgbtBlue;
           if (round(blue) > 255)
           {
               image[i][j].rgbtBlue = 255;
           }
           else if (round(blue) <= 255)
           {
               image[i][j].rgbtBlue = blue;
           }
       }
   }
   return;
}

// Reflect image horizontally
void reflect(int height, int width, RGBTRIPLE image[height][width])
{
   for (int i = 0; i < (height - 1); i++)
   {
       //RGBTRIPLE

       int a[width - 1 /2];
       int b[width - 1 /2];
       int c[width - 1 /2];

       for (int j = 0; j < ((width/2) - 1); j++)
       {
           a[j] = image[i][(width - 1) - j].rgbtRed;
           b[j] = image[i][(width - 1) - j].rgbtGreen;
           c[j] = image[i][(width - 1) - j].rgbtBlue;
       }

       // GERADE / UNGERADE ZAHLEN VERARBEITEN

       for (int n = 0; (n + (width - 1) /2) < (width - 1); n++)
       {
           image[i][((width - 1)/2) - n].rgbtRed = image[i][((width - 1)/2) - n].rgbtRed;
           image[i][((width - 1)/2) - n].rgbtGreen = image[i][((width - 1)/2) - n].rgbtGreen;
           image[i][((width - 1)/2) - n].rgbtBlue = image[i][((width - 1)/2) - n].rgbtBlue;
       }

       for (int m = 0; m < ((width/2) - 1); m++)
       {
           image[i][m].rgbtRed = a[m];
           image[i][m].rgbtRed = b[m];
           image[i][m].rgbtRed = c[m];
       }
   }
   return;
}

// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width])
{
   return;
}

Ввод:

./filter -r stadium.bmp outfile.bmp 

(stadium.bmp - это просто файл, который я выбираю. Вы можете выбрать любой файл в качестве входных данных)

Вывод: успешно компилируется, см. прикрепленное изображение введите описание изображения здесь

1 Ответ

0 голосов
/ 13 апреля 2020

Ваш код слишком сложный. Вам не нужно делить изображение на значения RGB. Вам нужно поменять значения изображения слева направо или наоборот для достижения отражения.

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

RGBTRIPLE temp[width];

С temp вам нужно сохранить значения из image и поменять их местами. Ниже приведен шаблон проектирования, который вы можете использовать.

//Pseudo code
1. //Loop though the row of an image (start from row = 0). We need to iterate every row.
    2. // Loop through the height of an image to save current row in an image to the temp.
    3. // Swap the values in image by using the temp. 

Если вы хотите отфильтровать это одномерное изображение ниже.

val1, val2, valn, val3, val4

После фильтра отражения это будет примерно так.

val4, val3, valn, val2, val1
...