CS50 pset4 фильтр "размытие" - PullRequest
1 голос
/ 10 июля 2020

Так у меня эта проблема в фильтре pset4 менее удобна. У меня как-то не получается размытие. Моя проблема в том, что кажется, что высота не l oop, поэтому единственное, что работает в моем коде, - это первая строка.

Мой код отлично работает для первой строки, но во второй строке нет изменений и скоро. Это похоже на то, что в моем коде есть функция break, чтобы она остановилась после первой строки. Я думал, что это мое условие в if (), и, возможно, я был сбит с толку в условии, но он не объясняет, почему оно не работает для нижнего левого и правого углов поля, условие настолько простое, что нет путаницы. Я имею в виду, давайте предположим, что мое состояние по краям и средней части пикселя неправильное, но оно все равно должно вычислить угол последней строки поля. Даже если с моим условием или формулой что-то не так, оно должно изменить значение пикселя RGB, но это не так.

:( размытие правильно фильтрует изображение 3x3

тестирование с образцом изображения 3x3

first row: (10, 20, 30), (40, 50, 60), (70, 80, 90)

second row: (110, 130, 140), (120, 140, 150), (130, 150, 160)

third row: (200, 210, 220), (220, 230, 240), (240, 250, 255)

Ожидаемый результат:

70 85 95

80 95 105


90 105 115

117 130 140

127 140 149

137 150 159

163 178 188

170 185 194

178 193 201

Фактический результат:

70 85 95

80 95 105

90 105 115

110 130 140

120 140 150

130 150 160

200 210 220

220 230 240

240 250 255

Вот код

void blur(int height, int width, RGBTRIPLE image[height][width])
{
// Copying the height and width length
int heilen = height;
int widlen = width;


int avgRed;
int avgGreen;
int avgBlue;

// Creating temporary array
int tmpR[height][width];
int tmpG[height][width];
int tmpB[height][width];

//storing the values of the image[i][j] to my temporary array
for (int i = 0; i < heilen; i++)
{
    for (int j = 0; j < widlen; j++)
    {
        // storing the current images arrays to tmpRGB
        tmpR[i][j] = image[i][j].rgbtRed;
        tmpG[i][j] = image[i][j].rgbtGreen;
        tmpB[i][j] = image[i][j].rgbtBlue;
    }
}


for (height = 0; height < heilen; height++)
{
    for (width = 0; width < widlen; width++)
    {
        //=================== PIXELS IN CORNERS
        //upper left corner side of the box
        if (height == 0 && width == 0)
        {
            //calculating the total values of the curreent row and pixel and current row and pixel + 1
            float current_row_Red = tmpR[height][width] + tmpR[height][width + 1];

            //calculating the total values of the next row current pixel and pixel + 1
            float after_row_Red = tmpR[height + 1][width] + tmpR[height + 1][width + 1];

            //getting the average of the total current row and next row and dividing it to 4
            avgRed = round ((current_row_Red + after_row_Red) / 4);


            float current_row_Green = tmpG[height][width] + tmpG[height][width + 1];
            float after_row_Green = tmpG[height + 1][width] + tmpG[height + 1][width + 1];
            avgGreen = round ((current_row_Green + after_row_Green) / 4);

            float current_row_Blue = tmpB[height][width] + tmpB[height][width + 1];
            float after_row_Blue = tmpB[height + 1][width] + tmpB[height + 1][width + 1];
            avgBlue = round ((current_row_Blue + after_row_Blue) / 4);

        }

        // upper right corner side of Box
        else if (height == 0 && width == widlen - 1)
        {
            float current_row_Red = tmpR[height][width] + tmpR[height][width - 1];
            float after_row_Red = tmpR[height + 1][width] + tmpR[height + 1][width - 1];
            avgRed = round ((current_row_Red + after_row_Red) / 4);


            float current_row_Green = tmpG[height][width] + tmpG[height][width - 1];
            float after_row_Green = tmpG[height + 1][width] + tmpG[height  + 1][width - 1];
            avgGreen = round ((current_row_Green + after_row_Green) / 4);

            float current_row_Blue = tmpB[height][width] + tmpB[height][width - 1];
            float after_row_Blue = tmpB[height + 1][width] + tmpB[height + 1][width - 1];
            avgBlue = round ((current_row_Blue + after_row_Blue) / 4);

        }

        //lower left corner side of the box
        else if (height == heilen - 1 && width == 0)
        {
            float current_row_Red = tmpR[height][width] + tmpR[height][width + 1];
            float before_row_Red =  tmpR[height - 1][width] + tmpR[height - 1][width + 1];
            avgRed = round ((current_row_Red + before_row_Red) / 4);

            float current_row_Green = tmpG[height][width] + tmpG[height][width + 1];
            float before_row_Green =  tmpG[height - 1][width] + tmpG[height - 1][width + 1];
            avgGreen = round ((current_row_Green + before_row_Green) / 4);

            float current_row_Blue = tmpB[height][width] + tmpB[height][width + 1];
            float before_row_Blue =  tmpB[height - 1][width] + tmpB[height - 1][width + 1];
            avgBlue = round ((current_row_Blue + before_row_Blue) / 4);
        }

        //lower right corner side of the box
        else if (height == heilen - 1 && width == widlen - 1)
        {
            float current_row_Red = tmpR[height][width] + tmpR[height][width - 1];
            float before_row_Red =  tmpR[height - 1][width] + tmpR[height - 1][width - 1];
            avgRed = round ((current_row_Red + before_row_Red) / 4);

            float current_row_Green = tmpG[height][width] + tmpG[height][width - 1];
            float before_row_Green =  tmpG[height - 1][width] + tmpG[height - 1][width - 1];
            avgGreen = round ((current_row_Green + before_row_Green) / 4);

            float current_row_Blue = tmpB[height][width] + tmpB[height][width - 1];
            float before_row_Blue =  tmpB[height - 1][width] + tmpB[height - 1][width - 1];
            avgBlue = round ((current_row_Blue + before_row_Blue) / 4);
        }


        // ===================== PIXELS ON EDGES

        //upper side of the box
        else if ( (height == 0 && width >= 1) && (height == 0 &&width < widlen - 1) )
        {
            float current_row_Red = tmpR[height][width] + tmpR[height][width - 1] + tmpR[height][width + 1];
            float after_row_Red = tmpR[height + 1][width] + tmpR[height + 1][width - 1] + tmpR[height + 1][width + 1];
            avgRed = round ((current_row_Red + after_row_Red) / 6);

            float current_row_Green = tmpG[height][width] + tmpG[height][width - 1] + tmpG[height][width + 1];
            float after_row_Green = tmpG[height + 1][width] + tmpG[height + 1][width - 1] + tmpG[height + 1][width + 1];
            avgGreen = round ((current_row_Green + after_row_Green) / 6);

            float current_row_Blue = tmpB[height][width] + tmpB[height][width - 1] + tmpB[height][width + 1];
            float after_row_Blue = tmpB[height + 1][width] + tmpB[height + 1][width - 1] + tmpB[height + 1][width + 1];
            avgBlue = round ((current_row_Blue + after_row_Blue) / 6);
        }

        //lower side of the box
        else if (  ( height == heilen - 1 && width >= 1) && ( height == heilen - 1 && width < widlen - 1) )

        {
            float current_row_Red = tmpR[height][width] + tmpR[height][width - 1] + tmpR[height][width + 1];
            float before_row_Red =  tmpR[height - 1][width] + tmpR[height - 1][width - 1] + tmpR[height - 1][width + 1];
            avgRed = round ((current_row_Red + before_row_Red) / 6);

            float current_row_Green = tmpG[height][width] + tmpG[height][width - 1] + tmpG[height][width + 1];
            float before_row_Green =  tmpG[height - 1][width] + tmpG[height - 1][width - 1] + tmpG[height - 1][width + 1];
            avgGreen = round ((current_row_Green + before_row_Green) / 6);

            float current_row_Blue = tmpB[height][width] + tmpB[height][width - 1] + tmpB[height][width + 1];
            float before_row_Blue =  tmpB[height - 1][width] + tmpB[height - 1][width - 1] + tmpB[height - 1][width + 1];
            avgBlue = round ((current_row_Blue + before_row_Blue) / 6);
        }

        // left side of the box
        else if (  (height >= 1 && width == 0) && (height < heilen - 1 && width == 0) )
        {
            float current_row_Red = tmpR[height][width] + tmpR[height][width + 1];
            float before_row_Red =  tmpR[height - 1][width] + tmpR[height - 1][width + 1];
            float after_row_Red = tmpR[height + 1][width] + tmpR[height + 1][width + 1];
            avgRed = round ((current_row_Red + before_row_Red + after_row_Red) / 6);

            float current_row_Green = tmpG[height][width] + tmpG[height][width + 1];
            float before_row_Green =  tmpG[height - 1][width] + tmpG[height - 1][width + 1];
            float after_row_Green = tmpG[height + 1][width] + tmpG[height + 1][width + 1];
            avgGreen = round ((current_row_Green + before_row_Green + after_row_Green) / 6);

            float current_row_Blue = tmpB[height][width] + tmpB[height][width + 1];
            float before_row_Blue =  tmpB[height - 1][width] + tmpB[height - 1][width + 1];
            float after_row_Blue = tmpB[height + 1][width] + tmpB[height + 1][width + 1];
            avgBlue = round ((current_row_Blue + before_row_Blue + after_row_Blue) / 6);

        }

        //right side of the box
        else if ( ( height >= 1 && width == widlen- 1) && (height <= heilen -1 && width == widlen - 1) )
        {
            float current_row_Red = tmpR[height][width] + tmpR[height][width - 1];
            float before_row_Red =  tmpR[height - 1][width] + tmpR[height - 1][width - 1];
            float after_row_Red = tmpR[height + 1][width] + tmpR[height + 1][width - 1];
            avgRed = round ((current_row_Red + before_row_Red + after_row_Red) / 6);

            float current_row_Green = tmpG[height][width] + tmpG[height][width - 1];
            float before_row_Green =  tmpG[height - 1][width] + tmpG[height - 1][width - 1];
            float after_row_Green = tmpG[height + 1][width] + tmpG[height + 1][width - 1];
            avgGreen = round ((current_row_Green + before_row_Green + after_row_Green) / 6);

            float current_row_Blue = tmpB[height][width] + tmpB[height][width - 1];
            float before_row_Blue =  tmpB[height - 1][width] + tmpB[height - 1][width - 1];
            float after_row_Blue = tmpB[height + 1][width] + tmpB[height + 1][width - 1];
            avgBlue = round ((current_row_Blue + before_row_Blue + after_row_Blue) / 6);

        }


        //====================MIDDLE PIXELS

        //middle of the box
        else if ( (height >= 1 && width >= 1) && (height < heilen - 1 && width < widlen - 1) )
        {
            float current_row_Red = tmpR[height][width] + tmpR[height][width - 1] + tmpR[height][width + 1];
            float after_row_Red = tmpR[height + 1][width] + tmpR[height + 1][width - 1] + tmpR[height + 1][width + 1];
            float before_row_Red =  tmpR[height - 1][width] + tmpR[height - 1][width - 1] + tmpR[height - 1][width + 1];
            avgRed = round ((current_row_Red + before_row_Red + after_row_Red) / 9);

            float current_row_Green = tmpG[height][width] + tmpG[height][width - 1] + tmpG[height][width + 1];
            float before_row_Green =  tmpG[height - 1][width] + tmpG[height - 1][width - 1] + tmpG[height - 1][width + 1];
            float after_row_Green = tmpG[height + 1][width] + tmpG[height + 1][width - 1] + tmpG[height + 1][width + 1];
            avgGreen = round ((current_row_Green + before_row_Green + after_row_Green) / 9);

            float current_row_Blue = tmpB[height][width] + tmpB[height][width - 1] + tmpB[height][width + 1];
            float before_row_Blue =  tmpB[height - 1][width] + tmpB[height - 1][width - 1] + tmpB[height - 1][width + 1];
            float after_row_Blue = tmpB[height + 1][width] + tmpB[height + 1][width - 1] + tmpB[height + 1][width + 1];
            avgBlue = round ((current_row_Blue + before_row_Blue + after_row_Blue) / 9);

        }

        //Assigning the cuurent average of RGB to image[][]
        image[height][width].rgbtRed = avgRed;
        image[height][width].rgbtGreen = avgGreen;
        image[height][width].rgbtBlue = avgBlue;


    }
    return;
}

}

Вы заметите, что начиная со второй строки фактическое выходное значение совпадает с заданным.

Я знаю, что это не самый эффективный способ сделать это, но я ничего не могу с этим поделать, я все еще новичок, только начал кодировать более 1 месяца. Помогите мне, пожалуйста> _ <</p>

...