【问题标题】:CS50 Edge Detection bad resultsCS50 边缘检测不良结果
【发布时间】:2021-07-19 03:32:54
【问题描述】:

我已经坚持了几个小时了 每件事都运行良好并输出应有的值,但不知何故出了点问题 我什至一步一步地按照程序计算了 3 x 3 网格的结果,我得到的结果与我从 excel 中的计算表中获取的图片中的程序输出相同,我不知道出了什么问题

    // Detect edges
void edges(int height, int width, RGBTRIPLE image[height][width])
{

    int b = 0, g = 0, r = 0,x = 0, y = 0, sumx[3], sumy[3],multi[3],sqr[3]; //arrays are in order of b g r
    int Gx[3][3] = {
       {-1,0,1},
       {-2,0,2},
       {-1,0,1},
    };
    int Gy[3][3] = {
       {-1,-2,-1},
       {0,0,0},
       {1,2,1},
    };


    for (int h = 0 ; h < height ; h++)
    {
        for (int w = 0; w < width; w++)
        {
            for (int i = 0 ; i < 3 ; i++) // to reset the sum array
            {
                sumx[i] = 0;
                sumy[i] = 0;
            }

                y = 0;
                for (int i = h-1 ; i <= h+1 ; i++)
                {
                    x = 0;
                   for (int n = w-1 ; n <= w+1 ;n++)
                   {
                        if ( i >= 0 && i <= height && n >= 0 && n <= width)
                        {

                            b = image[i][n].rgbtBlue;
                            g = image[i][n].rgbtGreen;
                            r = image[i][n].rgbtRed;
                            sumx[0] += b*Gx[y][x];
                            sumx[1] += g*Gx[y][x];
                            sumx[2] += r*Gx[y][x];

                            sumy[0] += b*Gy[y][x];
                            sumy[1] += g*Gy[y][x];
                            sumy[2] += r*Gy[y][x];

                        }
                        ++x;
                   }
                   ++y;
                }

                multi[0] = pow(sumx[0],2)+pow(sumy[0],2);
                sqr[0] = round(sqrt(multi[0]));
                multi[1] = pow(sumx[1],2)+pow(sumy[1],2);
                sqr[1] = round(sqrt(multi[1]));
                multi[2] = pow(sumx[2],2)+pow(sumy[2],2);
                sqr[2] = round(sqrt(multi[2]));
                    for (int i = 0 ; i < 3 ;i++)          // to check if sqred is bigger than 255
                    {
                        if (sqr[i]>255)
                        {
                            sqr[i] = 255;
                        }
                    }
                image[h][w].rgbtBlue = sqr[0];
                image[h][w].rgbtGreen = sqr[1];
                image[h][w].rgbtRed = sqr[2];

        }

    }
    return;
}

enter image description here

enter image description here

【问题讨论】:

  • 当您将图像中的数据提供给您的函数并在您最喜欢的调试器中逐步执行代码时会发生什么?

标签: c cs50


【解决方案1】:

行内:

if ( i >= 0 && i <= height && n >= 0 && n <= width)

应该是:

if ( i >= 0 && i < height && n >= 0 && n < width)

否则,您将超出图像的右边缘和下边缘。

【讨论】:

  • 这确实是一个错误,但这不是造成这个问题的原因,所以我最后发现我正在读取和写入同一个图像而不是从副本中读取,所以我正在读取我的值已经改变,而不是从一张图片中读取值并将结果应用于另一张图片
【解决方案2】:

对于将来可能会遇到此问题的任何人 这是我犯的错误 ... 最后我发现我正在读取和写入同一张图像而不是从副本中读取,所以我正在读取我已经更改的值,而不是从一张图片中读取原始值并将结果应用于另一张图片

【讨论】:

    猜你喜欢
    • 2016-09-12
    • 1970-01-01
    • 2020-11-13
    • 2017-12-13
    • 2014-03-30
    • 2018-12-30
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    相关资源
    最近更新 更多