CS50 pset4 фильтр отражение - PullRequest
0 голосов
/ 30 мая 2020
#include "helpers.h"
#include <math.h>
// Convert image to grayscale
void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
    for ( int h=0 ; h<height ; h++) 
    {
        for (int w=0 ; w<width ; w++)
        {
           int i = image[h][w].rgbtBlue + image[h][w].rgbtGreen + image[h][w].rgbtRed ;
           float j = i/3 ;
           int n = round(j) ;

           image[h][w].rgbtBlue = n ;
           image[h][w].rgbtGreen = n ;
           image[h][w].rgbtRed = n ;
        }
    }
    return;
}

// Convert image to sepia
void sepia(int height, int width, RGBTRIPLE image[height][width])
{
    for ( int h=0 ; h<height ; h++) 
    {
        for (int w=0 ; w<width ; w++)
        {
            float sr = .393 * image[h][w].rgbtRed + .769 * image[h][w].rgbtGreen + .189 * image[h][w].rgbtBlue ;
            float sg = .349 * image[h][w].rgbtRed + .686 * image[h][w].rgbtGreen + .168 * image[h][w].rgbtBlue ;
            float sb = .272 * image[h][w].rgbtRed + .534 * image[h][w].rgbtGreen + .131 * image[h][w].rgbtBlue ;

            int SR = round(sr);
            int SG = round(sg);
            int SB = round(sb);

            if ( SR>255)
            {
                SR = 255 ;
            }
            if (SG>255)
            {
                SG = 255 ;
            }
            if (SB>255)
            {
                 SB = 255 ;
            }

            image[h][w].rgbtBlue = SB ;
            image[h][w].rgbtGreen = SG ;
            image[h][w].rgbtRed = SR ;
        }
    }
    return;
}

// Reflect image horizontally
void swap (int *a , int *b) ;

void reflect(int height, int width, RGBTRIPLE image[height][width])
{
    for (int h=0 ; h<height ; h++) 
    {
        for (int w=0 ; w<width/2 ; w++)
        {
            for (int p=width-1 ; p>=round(width/2) ; p--)
            {
                int blue = image[h][w].rgbtBlue ;
                int B = image[h][p].rgbtBlue ;
                swap(&blue , &B);

                int g = image[h][w].rgbtGreen ;
                int G = image[h][p].rgbtGreen ;
                swap(&g , &G);

                int r = image[h][w].rgbtRed ;
                int R = image[h][p].rgbtRed ;
                swap(&r , &R );

            }
        }
    }
    return;
}
void swap (int *a , int *b)
    {
        int tmp = *a ;
            *a = *b ;
            *b = tmp ;
    }

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

Я написал этот код для helper.c. Он нормально компилируется и работает с оттенками серого и сепией, но не отражает изображение.

Я застрял в нем. Скажите, пожалуйста, где я сделал ошибку.

Ответы [ 2 ]

0 голосов
/ 02 июня 2020

Вам не нужен третий для l oop

for (int p=width-1 ; p>=round(width/2) ; p--)

, вместо этого вы можете назначить противоположный пиксель внутри второго l oop следующим образом:

for (int w=0 ; w<width/2 ; w++)
{
    p = width - w - 1;
    ...
}
0 голосов
/ 31 мая 2020
// Reflect image horizontally
void reflect(int height, int width, RGBTRIPLE image[height][width])
{

    int tmp[3];
    for (int h = 0; h < height; h++)
    {
        for (int w = 0; w < width / 2; w++)
        {
            // Place the first pixel in a temporary variable
            tmp[0] = image[h][w].rgbtRed;
            tmp[1] = image[h][w].rgbtGreen;
            tmp[2] = image[h][w].rgbtBlue;
            // Place the opposite pixel one into the first pixel
            image[h][w].rgbtRed = image[h][width - w - 1].rgbtRed;
            image[h][w].rgbtGreen = image[h][width - w - 1].rgbtGreen;
            image[h][w].rgbtBlue = image[h][width - w - 1].rgbtBlue;
            // From the temporary variable extract the first pixel and place it into  
            the opposite pixel
            image[h][width - w - 1].rgbtRed = tmp[0];
            image[h][width - w - 1].rgbtGreen = tmp[1];
            image[h][width - w - 1].rgbtBlue = tmp[2];
        }
    }
   return;
}
...