0

I am working on a CS50 problem set in which I need to do a box blur for each pixel of an image. Though my code is a bit redundant, as I had created many if loop for special cases of pixels (like edges and corners), it blurs the image as expected, so I'm not really sure how to fix the problem.

There's also a more detailed error code here (only look at the "blur" errors)

I think make this error because the value can't save like that(but I printed and unhide on my screen)

//assign new values of surrounding pixels to that pixel.
            image[i][j].rgbtBlue = averageBlue;
            image[i][j].rgbtGreen = averageGreen;
            image[i][j].rgbtRed = averageRed;

Here's my code below:

// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width])
{
    for (int i = 0; i < height; i++) {  // Run vertically the image

        for (int j = 0; j < width; j++) {   // Run horizontally the image

            int iplus = i + 1;  // pixel kế tiếp theo hàng dọc
            int jplus = j + 1;  // pixel kế tiếp theo hàng ngang
            int iminus  = i - 1; // trước đó theo hàng dọc
            int jminus = j - 1; // trước đó theo hàng ngang

            //make red pointer, green pointer and blue pointer of array to save value pixel
            int *ninepred;
            int *ninepgreen;
            int *ninepblue;

            //By default, around a pixel is 8 pixels with count = 9(8 pixel around and it's self)
            int count = 9;


            //Used to calculate the sum of the elements in the three arrays ninepred, ninegreen and nineblue
            int totalRed = 0;
            int totalGreen = 0;
            int totalBlue = 0;

            // kiem tra 4 o o 4 goc
            if ((i == 0 && j == 0) || (i = 0 && j == width - 1) ||
                 (i == height - 1 && j == 0) || (i == height - 1 && j == width - 1)) {
                     count = 4;  //include 3 pixels around and itself


                     // make space memory by malloc for pointer.
                    ninepred = (int*)malloc(count * sizeof(int));
                    ninepgreen = (int*)malloc(count * sizeof(int));
                    ninepblue = (int*)malloc(count * sizeof(int));

                     if (i == 0 && j == 0) {
                         // add red RMB
                        ninepred[0] = image[i][j].rgbtRed;
                        ninepred[1] = image[i][jplus].rgbtRed;
                        ninepred[2] = image[iplus][j].rgbtRed;
                        ninepred[3] = image[iplus][jplus].rgbtRed;

                         // add green RMB
                        ninepgreen[0] = image[i][j].rgbtGreen;
                        ninepgreen[1] = image[i][jplus].rgbtGreen;
                        ninepgreen[2] = image[iplus][j].rgbtGreen;
                        ninepgreen[3] = image[iplus][jplus].rgbtGreen;

                        // add glue RMB
                        ninepblue[0] = image[i][j].rgbtBlue;
                        ninepblue[1] = image[i][jplus].rgbtBlue;
                        ninepblue[2] = image[iplus][j].rgbtBlue;
                        ninepblue[3] = image[iplus][jplus].rgbtBlue;
                     }
                     else if (i == 0 && j == width - 1) {

                         // add red RMB
                        ninepred[0] = image[i][j].rgbtRed;
                        ninepred[1] = image[i][jminus].rgbtRed;
                        ninepred[2] = image[iplus][j].rgbtRed;
                        ninepred[3] = image[iplus][jminus].rgbtRed;

                         // add green RMB
                        ninepgreen[0] = image[i][j].rgbtGreen;
                        ninepgreen[1] = image[i][jminus].rgbtGreen;
                        ninepgreen[2] = image[iplus][j].rgbtGreen;
                        ninepgreen[3] = image[iplus][jminus].rgbtGreen;

                        // add glue RMB
                        ninepblue[0] = image[i][j].rgbtBlue;
                        ninepblue[1] = image[i][jminus].rgbtBlue;
                        ninepblue[2] = image[iplus][j].rgbtBlue;
                        ninepblue[3] = image[iplus][jminus].rgbtBlue;

                     }
                     else if (i == height - 1 && j == 0) {

                         // add red RMB
                        ninepred[0] = image[i][j].rgbtRed;
                        ninepred[1] = image[i][jplus].rgbtRed;
                        ninepred[2] = image[iminus][j].rgbtRed;
                        ninepred[3] = image[iminus][jplus].rgbtRed;

                         // add green RMB
                        ninepgreen[0] = image[i][j].rgbtGreen;
                        ninepgreen[1] = image[i][jplus].rgbtGreen;
                        ninepgreen[2] = image[iminus][j].rgbtGreen;
                        ninepgreen[3] = image[iminus][jplus].rgbtGreen;

                        // add glue RMB
                        ninepblue[0] = image[i][j].rgbtBlue;
                        ninepblue[1] = image[i][jplus].rgbtBlue;
                        ninepblue[2] = image[iminus][j].rgbtBlue;
                        ninepblue[3] = image[iminus][jplus].rgbtBlue;

                     } else {

                         // add red RMB
                        ninepred[0] = image[i][j].rgbtRed;
                        ninepred[1] = image[i][jminus].rgbtRed;
                        ninepred[2] = image[iminus][j].rgbtRed;
                        ninepred[3] = image[iminus][jminus].rgbtRed;

                         // add green RMB
                        ninepgreen[0] = image[i][j].rgbtGreen;
                        ninepgreen[1] = image[i][jminus].rgbtGreen;
                        ninepgreen[2] = image[iminus][j].rgbtGreen;
                        ninepgreen[3] = image[iminus][jminus].rgbtGreen;

                        // add glue RMB
                        ninepblue[0] = image[i][j].rgbtBlue;
                        ninepblue[1] = image[i][jminus].rgbtBlue;
                        ninepblue[2] = image[iminus][j].rgbtBlue;
                        ninepblue[3] = image[iminus][jminus].rgbtBlue;

                     };

                 }

            else if (i == 0) {
                count = 6;//include 5 pixels around and itself


                 // make space memory by malloc for pointer.
                ninepred = (int*)malloc(count * sizeof(int));
                ninepgreen = (int*)malloc(count * sizeof(int));
                ninepblue = (int*)malloc(count * sizeof(int));


                //insert 3 value  0 as to 9P array
                ninepred[0] = image[i][j].rgbtRed;
                ninepred[1] = image[i][jplus].rgbtRed;
                ninepred[2] = image[i][jminus].rgbtRed;
                ninepred[3] = image[iplus][j].rgbtRed;
                ninepred[4] = image[iplus][jplus].rgbtRed;
                ninepred[5] = image[iplus][jminus].rgbtRed;

                //insert green pixel
                ninepgreen[0] = image[i][j].rgbtGreen;
                ninepgreen[1] = image[i][jplus].rgbtGreen;
                ninepgreen[2] = image[i][jminus].rgbtGreen;
                ninepgreen[3] = image[iplus][j].rgbtGreen;
                ninepgreen[4] = image[iplus][jplus].rgbtGreen;
                ninepgreen[5] = image[iplus][jminus].rgbtGreen;

                // add glue RMB
                ninepblue[0] = image[i][j].rgbtBlue;
                ninepblue[1] = image[i][jplus].rgbtBlue;
                ninepblue[2] = image[i][jminus].rgbtBlue;
                ninepblue[3] = image[iplus][j].rgbtBlue;
                ninepblue[4] = image[iplus][jplus].rgbtBlue;
                ninepblue[5] = image[iplus][jminus].rgbtBlue;


            }
            //check the finally row
            else if (i == height -1) {
                count = 6;//include 5 pixels around and itself
                // make space memory by malloc for pointer.
                ninepred = (int*)malloc(count * sizeof(int));
                ninepgreen = (int*)malloc(count * sizeof(int));
                ninepblue = (int*)malloc(count * sizeof(int));


                //insert 3 value  0 as to 9P array
                ninepred[0] = image[i][j].rgbtRed;
                ninepred[1] = image[i][jplus].rgbtRed;
                ninepred[2] = image[i][jminus].rgbtRed;
                ninepred[3] = image[iminus][j].rgbtRed;
                ninepred[4] = image[iminus][jplus].rgbtRed;
                ninepred[5] = image[iminus][jminus].rgbtRed;

                //insert green pixel
                ninepgreen[0] = image[i][j].rgbtGreen;
                ninepgreen[1] = image[i][jplus].rgbtGreen;
                ninepgreen[2] = image[i][jminus].rgbtGreen;
                ninepgreen[3] = image[iplus][j].rgbtGreen;
                ninepgreen[4] = image[iplus][jplus].rgbtGreen;
                ninepgreen[5] = image[iplus][jminus].rgbtGreen;

                // add glue RMB
                ninepblue[0] = image[i][j].rgbtBlue;
                ninepblue[1] = image[i][jplus].rgbtBlue;
                ninepblue[2] = image[i][jminus].rgbtBlue;
                ninepblue[3] = image[iminus][j].rgbtBlue;
                ninepblue[4] = image[iminus][jplus].rgbtBlue;
                ninepblue[5] = image[iminus][jminus].rgbtBlue;

            }
            //check the first column

            else if (j == 0) {
                count = 6;//include 5 pixels around and itself

                // make space memory by malloc for pointer.
                ninepred = (int*)malloc(count * sizeof(int));
                ninepgreen = (int*)malloc(count * sizeof(int));
                ninepblue = (int*)malloc(count * sizeof(int));

                ninepred[0] = image[i][j].rgbtRed;
                ninepred[1] = image[i][jplus].rgbtRed;
                ninepred[2] = image[iplus][j].rgbtRed;
                ninepred[3] = image[iplus][jplus].rgbtRed;
                ninepred[4] = image[iminus][j].rgbtRed;
                ninepred[5] = image[iminus][jplus].rgbtRed;

                //insert green pixel
                ninepgreen[0] = image[i][j].rgbtGreen;
                ninepgreen[1] = image[i][jplus].rgbtGreen;
                ninepgreen[2] = image[iplus][j].rgbtGreen;
                ninepgreen[3] = image[iplus][jplus].rgbtGreen;
                ninepgreen[4] = image[iminus][j].rgbtGreen;
                ninepgreen[5] = image[iminus][jplus].rgbtGreen;


                // add glue RMB
                ninepblue[0] = image[i][j].rgbtBlue;
                ninepblue[1] = image[i][jplus].rgbtBlue;
                ninepblue[2] = image[iplus][j].rgbtBlue;
                ninepblue[3] = image[iplus][jplus].rgbtBlue;
                ninepblue[4] = image[iminus][j].rgbtBlue;
                ninepblue[5] = image[iminus][jplus].rgbtBlue;

            }
            //check the finally column
            else if (j == width - 1) {
                count = 6;//include 5 pixels around and itself

                // make space memory by malloc for pointer.
                ninepred = (int*)malloc(count * sizeof(int));
                ninepgreen = (int*)malloc(count * sizeof(int));
                ninepblue = (int*)malloc(count * sizeof(int));

                ninepred[0] = image[i][j].rgbtRed;
                ninepred[1] = image[i][jminus].rgbtRed;
                ninepred[2] = image[iplus][j].rgbtRed;
                ninepred[3] = image[iplus][jminus].rgbtRed;
                ninepred[4] = image[iminus][j].rgbtRed;
                ninepred[5] = image[iminus][jminus].rgbtRed;

                //insert green pixel
                ninepgreen[0] = image[i][j].rgbtGreen;
                ninepgreen[1] = image[i][jminus].rgbtGreen;
                ninepgreen[2] = image[iplus][j].rgbtGreen;
                ninepgreen[3] = image[iplus][jminus].rgbtGreen;
                ninepgreen[4] = image[iminus][j].rgbtGreen;
                ninepgreen[5] = image[iminus][jminus].rgbtGreen;


                // add glue RMB
                ninepblue[0] = image[i][j].rgbtBlue;
                ninepblue[1] = image[i][jminus].rgbtBlue;
                ninepblue[2] = image[iplus][j].rgbtBlue;
                ninepblue[3] = image[iplus][jminus].rgbtBlue;
                ninepblue[4] = image[iminus][j].rgbtBlue;
                ninepblue[5] = image[iminus][jminus].rgbtBlue;


            }


            else {
                //insert red pixel

                 // make space memory by malloc for pointer.
                ninepred = (int*)malloc(count * sizeof(int));
                ninepgreen = (int*)malloc(count * sizeof(int));
                ninepblue = (int*)malloc(count * sizeof(int));

                ninepred[0] = image[i][j].rgbtRed;
                ninepred[1] = image[i][jplus].rgbtRed;
                ninepred[2] = image[i][jminus].rgbtRed;
                ninepred[3] = image[iminus][j].rgbtRed;
                ninepred[4] = image[iminus][j].rgbtRed;
                ninepred[5] = image[iminus][jminus].rgbtRed;
                ninepred[6] = image[iplus][j].rgbtRed;
                ninepred[7] = image[iplus][jplus].rgbtRed;
                ninepred[8] = image[iplus][jminus].rgbtRed;

                //insert green pixel
                ninepgreen[0] = image[i][j].rgbtGreen;
                ninepgreen[1] = image[i][jplus].rgbtGreen;
                ninepgreen[2] = image[i][jminus].rgbtGreen;
                ninepgreen[3] = image[iminus][j].rgbtGreen;
                ninepgreen[4] = image[iminus][j].rgbtGreen;
                ninepgreen[5] = image[iminus][jminus].rgbtGreen;
                ninepgreen[6] = image[iplus][j].rgbtGreen;
                ninepgreen[7] = image[iplus][jplus].rgbtGreen;
                ninepgreen[8] = image[iplus][jminus].rgbtGreen;

                //insert blue pixel
                ninepblue[0] = image[i][j].rgbtBlue;
                ninepblue[1] = image[i][jplus].rgbtBlue;
                ninepblue[2] = image[i][jminus].rgbtBlue;
                ninepblue[3] = image[iminus][j].rgbtBlue;
                ninepblue[4] = image[iminus][j].rgbtBlue;
                ninepblue[5] = image[iminus][jminus].rgbtBlue;
                ninepblue[6] = image[iplus][j].rgbtBlue;
                ninepblue[7] = image[iplus][jplus].rgbtBlue;
                ninepblue[8] = image[iplus][jminus].rgbtBlue;

            };


            //sum of each red, green and blue
            for (int z = 0; z < count; z++) {
                totalRed += *(ninepred + z);
                totalGreen += *(ninepgreen + z);
                totalBlue += *(ninepblue + z);
            };

            // printf("This is totalRed:%i\n", totalRed);


            int  averageRed = (round)((float)totalRed / count);
            int  averageGreen = (round)((float)totalGreen / count);
            int  averageBlue = (round)((float)totalBlue / count);




            totalRed = 0;
            totalGreen = 0;
            totalBlue = 0;

             //assign new values of surrounding pixels to that pixel.
            image[i][j].rgbtBlue = averageBlue;
            image[i][j].rgbtGreen = averageGreen;
            image[i][j].rgbtRed = averageRed;



            free(ninepred);
            free(ninepgreen);
            free(ninepblue);
            // printf("Blue: %i\nGreen: %i\nRed: %i\n", image[i][j].rgbtBlue, image[i][j].rgbtGreen, image[i][j].rgbtRed);

            };




    };
    printf("Finished");

}

Looking at other people's answers for this same problem. Firstly, I use malloc to create a memory of 3 arrays (ninepred, ninepgreen, ninepblue). Secondly, I check all cases and push red, blue, and green values to these arrays. Thirdly, I use a loop to sum all values in the array and averaged red value, green value, and blue value.Finally, assign it to image[i][j].rgbtBlue, image[i][j].rgbtGreen, image[i][j].rgbtRed but it can't return. I fix it so longtime and hope someone help me.

Phu Nguyen
  • 1
  • 1
  • 1
  • Goodness me! The code is so bloated there could be a minor slip anywhere that is hard to spot. I suggest the way forward is to review the algorithm you used, and make a general case that will handle the special cases too. – Weather Vane Jul 28 '21 at 06:57
  • 2
    Hmm, are you assigning the result back into the original image where it gets smeared over neighboring pixels during the next iterations? Take another good look at the wikipedia explanation, look for `newImage`. –  Jul 28 '21 at 07:00
  • 1
    ... so the average is using some pixels that have already been averaged and some that have not yet been averaged. Which means you get a different result depending on which edge you start at. – Weather Vane Jul 28 '21 at 07:08
  • 1
    @dratenik: I think i wrong like that. instead of copying the original image to the new image. I save the averages to the original image so in subsequent loops the calculated value will be wrong. – Phu Nguyen Jul 28 '21 at 07:17

0 Answers0