CS50 模糊功能未通过 check50

时间:2021-07-28 06:54:22

标签: c image cs50 blur

我正在研究一个 CS50 问题集,我需要为图像的每个像素做一个 box blur。虽然我的代码有点多余,因为我为像素的特殊情况(如边缘和角落)创建了许多 if 循环,但它按预期模糊了图像,所以我不确定如何解决这个问题。

还有更详细的错误代码here(只看“blur”错误)

我想犯这个错误是因为值不能那样保存(但我在屏幕上打印并取消隐藏)

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

这是我的代码如下:

// 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");

}

查看其他人对同一问题的回答。首先,我使用 malloc 创建了 3 个数组(ninepred、ninepgreen、ninepblue)的内存。其次,我检查所有情况并将红色、蓝色和绿色值推送到这些数组。第三,我使用循环对数组中的所有值求和并平均红色值、绿色值和蓝色值。最后,将其分配给 image[i][j].rgbtBlue, image[i][j].rgbtGreen, image[i][j].rgbtRed 但它无法返回。我修复了很长时间,希望有人帮助我。

0 个答案:

没有答案