微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CS50 过滤器更多边缘问题为什么我不能准确计算边缘像素?

如何解决CS50 过滤器更多边缘问题为什么我不能准确计算边缘像素?

嗨,我对与问题的“边缘”过滤器部分相关的代码有什么问题感到困惑。 我能够应用检测边缘的过滤器。出于某种原因,我没有通过 check50。我只能将过滤器应用于中间像素。任何指导将不胜感激。我想知道我是否以不正确的方式处理这个问题。

使用此代码,我只是忽略了“黑色像素”或高度/宽度范围之外的像素的计算。

这是我的代码

void edges(int height,int width,RGBTRIPLE image[height][width])
{
    //create temporary array
    RGBTRIPLE temp[height][width];
    for (int i = 0; i < height; i ++)
    {
        for (int j = 0; j < width; j++)
        {
            temp[i][j] = image[i][j];
        }
    }
    //initialize sobel arrays
    int gxarray[3][3] = {{-1,1},{-2,2},{-1,1}};
    int gyarray[3][3] = {{-1,-2,-1},{0,0},{1,2,1}};

    //loop through each ith pixel in jth column
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j ++)
        {
                float gx_red = 0;
                float gx_blue = 0;
                float gx_green = 0;
                float gy_red = 0;
                float gy_blue = 0;
                float gy_green = 0;

            //use the temporary array grid to calculate each gx value
            //check if it is a corner or side pixel - and treat that pixel as black pixel
            for (int k = -1; k < 2; k ++)
            {

                for (int l = -1; l < 2; l ++)
                {
                    //calculate the gx and gy for each color by multiply each of
                    //check if they are corner or sidepixels
                    if (i + k < 0 || i + k >= height)
                    {
                        continue;

                    }
                    if (j + l < 0 || j + l >= width)
                    {
                        continue;
                    }
                    //otherwise calculate each color value

                    gx_red += temp[i + k][j + l].rgbtRed * gxarray[k + 1][l + 1];
                    gx_blue += temp[i + k][j + l].rgbtBlue * gxarray[k + 1][l + 1];
                    gx_green += temp[i + k][j + l].rgbtGreen * gxarray[k + 1][l + 1];

                    gy_red += temp[i + k][j + l].rgbtRed * gyarray[k + 1][l + 1];
                    gy_blue += temp[i + k][j + l].rgbtBlue * gyarray[k + 1][l + 1];
                    gy_green += temp[i + k][j + l].rgbtGreen * gyarray[k + 1][l + 1];

                }

            }

            //times each number by itself then,add them,then square root them
            int red = 0 + round(sqrt(gx_red * gx_red + gy_red * gy_red));
            int blue = 0 + round(sqrt(gx_blue * gx_blue + gy_blue * gy_blue));
            int green = 0 + round(sqrt(gx_green * gx_green + gy_green * gy_green));

            image[i][j].rgbtRed = red;
            image[i][j].rgbtBlue = blue;
            image[i][j].rgbtGreen = green;



            //cap it by 255
            if (image[i][j].rgbtRed > 255)
            {
                image[i][j].rgbtRed = 255;
            }

            if (image[i][j].rgbtBlue > 255)
            {
                image[i][j].rgbtBlue = 255;
            }

            if (image[i][j].rgbtGreen > 255)
            {
                image[i][j].rgbtGreen = 255;
            }

        }
    }

    return;
}


```[enter image description here][1]


  [1]: https://i.stack.imgur.com/3bExI.png

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。