Search code examples
calgorithmcs50bmp

CS50 Pset4 Filter (less comfortable) blur function Algorithmic Issue


info about this task

when I try to implement blur function, It works fine to me on a picture, but check50 (cs50 test program) gives warning for my outputs.

Here is my code

void blur(int height, int width, RGBTRIPLE image[height][width])
{
    float average_red = 0;
    float average_green = 0;
    float average_blue = 0;
    float count = 0;
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            // reset values 
            average_red = 0;
            average_blue = 0;
            average_green = 0;
            count = 0;

            // look for around a pixel 3x3 box
            // column
            for (int k = i - 1; k < i + 2; k++)
            {
                // row
                for (int l = j - 1; l < j + 2; l++)
                {
                    // if pixel on the top
                    if (k == -1)
                    {
                        // it skips a column because it is out of the border
                        break;
                    }

                    // if pixel is on the left side
                    if (l == -1)
                    {
                        // skips a row otherwise it is out of the border
                        continue;
                    }

                    // if pixel passes the bottom
                    if (k >= height)
                    {
                        break;
                    }

                    // if pixels passes the right side
                    if (l >= width)
                    {
                        continue;
                    }
                    
                    // everything else
                    else
                    {
                        average_red += image[k][l].rgbtRed;
                        average_green += image[k][l].rgbtGreen;
                        average_blue += image[k][l].rgbtBlue;
                        count++;
                    }
                }   
            }

            average_red /= count;
            average_green /= count;
            average_blue /= count;
            image[i][j].rgbtRed  = round(average_red);
            image[i][j].rgbtGreen = round(average_green);
            image[i][j].rgbtBlue = round(average_blue);

        }
    }
    return;
}

expected output vs my output is here (blur functions output very down bellow)

It is working fine on the corner but other pixel values are very close to correct output, but not the same. Any help appreciated


Solution

  • I solved my own problem, thanks for helps anyway

    problem in was my sum calculation. it keeps result in image[i][j] and than again uses this value again. I copy image values to a new value and use on this. Here is my code

    void blur(int height, int width, RGBTRIPLE image[height][width])
    {
        // copy original value to a new value to keep changing values
        RGBTRIPLE copy[height][width];
        for (int i = 0; i < height; i++)
        {
            for (int j = 0; j < width; j++)
            {
                copy[i][j] = image[i][j];
            }
        }
    
        float average_red = 0.0f;
        float average_green = 0.0f;
        float average_blue = 0.0f;
        float count = 0;
    
        for (int i = 0; i < height; i++)
        {
            for (int j = 0; j < width; j++)
            {
                // reset values 
                average_red = 0.0f;
                average_blue = 0.0f;
                average_green = 0.0f;
                count = 0;
    
                // look for around a pixel 3x3 box
                // column
                for (int k = i - 1; k < i + 2; k++)
                {
                    // row
                    for (int l = j - 1; l < j + 2; l++)
                    {
                        // if pixel on the top
                        if (k == -1)
                        {
                            // it skips a column because it is out of the border
                            break;
                        }
    
                        // if pixel is on the left side
                        else if (l == -1)
                        {
                            // skips a row otherwise it is out of the border
                            continue;
                        }
    
                        // if pixel passes the bottom
                        else if (k >= height)
                        {
                            break;
                        }
    
                        // if pixels passes the right side
                        else if (l >= width)
                        {
                            continue;
                        }
                        
                        // everything else
                        else
                        {
                            average_red += copy[k][l].rgbtRed;
                            average_green += copy[k][l].rgbtGreen;
                            average_blue += copy[k][l].rgbtBlue;
                            count++;
                        }
                    }   
                }
    
                average_red /= count;
                average_green /= count;
                average_blue /= count;
                image[i][j].rgbtRed  = round(average_red);
                image[i][j].rgbtGreen = round(average_green);
                image[i][j].rgbtBlue = round(average_blue);
    
            }
        }
        return;
    }