CS50 PSET4 FILFER-MORE:EDGES()函数(在某种程度上过滤图像,但与答案不匹配。)

发布于 2025-02-04 17:37:22 字数 6576 浏览 2 评论 0原文

链接到问题(仅边零件)在这里

在此代码中,我使用SOBEL操作员来识别BMP图像中的边缘。

我尝试了各种不同的事情,正确编译了代码(没有错误),并且获得的输出图像显示了像素的边缘,看起来像是正确应用Sobel filter,但是当我检查我的代码时,它是与答案不匹配。 请帮助我在代码中找到错误的错误。 谢谢。

这是函数的主要代码:

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

    // Array for storing corresponding gx values of the pixels.
    RGBTRIPLE(*gx)[width] = calloc(height, width * sizeof(RGBTRIPLE));
    if (gx == NULL)
    {
        printf("Not enough memory to store blur pixels.\n");
        return;
    }

    // Array for storing corresponding gy values of the pixels.
    RGBTRIPLE(*gy)[width] = calloc(height, width * sizeof(RGBTRIPLE));
    if (gy == NULL)
    {
        printf("Not enough memory to store blur pixels.\n");
        return;
    }


    for (int row = 0; row < height; row++)
    {
        for (int col = 0; col < width; col++)
        {
            Gx(row, col, height, width, image, gx);
            Gy(row, col, height, width, image, gy);
        }
    }

    for (int row = 0; row < height; row++)
    {
        for (int col = 0; col < width; col++)
        {
            image[row][col].rgbtBlue = r_sqrt_sum(gx[row][col].rgbtBlue, gy[row][col].rgbtBlue);
            image[row][col].rgbtGreen = r_sqrt_sum(gx[row][col].rgbtGreen, gy[row][col].rgbtGreen);
            image[row][col].rgbtRed = r_sqrt_sum(gx[row][col].rgbtRed, gy[row][col].rgbtRed);

        }
    }

    free(gx);
    free(gy);
    return;
}

gx和gy的声明:

void Gx(int row, int col, int height, int width, RGBTRIPLE matrix[height][width], RGBTRIPLE new_matrix[height][width])
// This function will return Gx value of a given pixel.
{
    float Blue = 0;
    float Green = 0;
    float Red = 0;

    for (int i = -1; i < 2; i++)
    {
        for (int j = -1; j < 2; j++)
        {
            // for rows and columns out of range.
            if ((i + row) < 0 || (i + row >= height) || (j + col) < 0 || (j + col >= width))
            {
                continue;
            }

            // for (-1,-1) and (1,-1)
            else if ((i == -1 && j == -1) || (i == 1 && j == -1))
            {
                Blue += matrix[i + row][j + col].rgbtBlue * -1;
                Green += matrix[i + row][j + col].rgbtGreen * -1;
                Red += matrix[i + row][j + col].rgbtRed * -1;
            }

            // for (0,-1)
            else if ((i == 0 && j == -1))
            {
                Blue += matrix[i + row][j + col].rgbtBlue * -2;
                Green += matrix[i + row][j + col].rgbtGreen * -2;
                Red += matrix[i + row][j + col].rgbtRed * -2;
            }

            // for (-1, 0) , (0, 0), (1, 0)
            else if ((i == -1 && j == 0) || (i == 0 && j == 0) || (i == 1 && j == 0))
            {
                Blue += matrix[i + row][j + col].rgbtBlue * 0;
                Green += matrix[i + row][j + col].rgbtGreen * 0;
                Red += matrix[i + row][j + col].rgbtRed * 0;
            }

            // for (0, 1)
            else if ((i == 0 && j == 1))
            {
                Blue += matrix[i + row][j + col].rgbtBlue * 2;
                Green += matrix[i + row][j + col].rgbtGreen * 2;
                Red += matrix[i + row][j + col].rgbtRed * 2;
            }

            // for (-1,1) and (1,1)
            else if ((i == -1 && j == 1) || (i == 1 && j == 1))
            {
                Blue += matrix[i + row][j + col].rgbtBlue * 1;
                Green += matrix[i + row][j + col].rgbtGreen * 1;
                Red += matrix[i + row][j + col].rgbtRed * 1;
            }
        }
    }

    new_matrix[row][col].rgbtBlue = fabsf(Blue);
    new_matrix[row][col].rgbtGreen = fabsf(Green);
    new_matrix[row][col].rgbtRed = fabsf(Red);
}


void Gy(int row, int col, int height, int width, RGBTRIPLE matrix[height][width], RGBTRIPLE new_matrix[height][width])
// This function will return Gy value of a given pixel.
{
    float Blue = 0;
    float Green = 0;
    float Red = 0;

    for (int i = -1; i < 2; i++)
    {
        for (int j = -1; j < 2; j++)
        {
            // for rows and columns out of range.
            if ((i + row) < 0 || (i + row >= height) || (j + col) < 0 || (j + col >= width))
            {
                continue;
            }

            // for (-1,-1) and (-1,1)
            else if ((i == -1 && j == -1) || (i == -1 && j == 1))
            {
                Blue += matrix[i + row][j + col].rgbtBlue * -1;
                Green += matrix[i + row][j + col].rgbtGreen * -1;
                Red += matrix[i + row][j + col].rgbtRed * -1;
            }

            // for (0, -1)
            else if ((i == 0 && j == -1))
            {
                Blue += matrix[i + row][j + col].rgbtBlue * -2;
                Green += matrix[i + row][j + col].rgbtGreen * -2;
                Red += matrix[i + row][j + col].rgbtRed * -2;
            }

            // for (0, -1) , (0, 0), (0, 1)
            else if ((i == 0 && j == -1) || (i == 0 && j == 0) || (i == 0 && j == 1))
            {
                Blue += matrix[i + row][j + col].rgbtBlue * 0;
                Green += matrix[i + row][j + col].rgbtGreen * 0;
                Red += matrix[i + row][j + col].rgbtRed * 0;
            }

            // for (1, 0)
            else if ((i ==1 && j == 0))
            {
                Blue += matrix[i + row][j + col].rgbtBlue * 2;
                Green += matrix[i + row][j + col].rgbtGreen * 2;
                Red += matrix[i + row][j + col].rgbtRed * 2;
            }

            // for (1,-1) and (1,1)
            else if ((i == 1 && j == -1) || (i == 1 && j == 1))
            {
                Blue += matrix[i + row][j + col].rgbtBlue * 1;
                Green += matrix[i + row][j + col].rgbtGreen * 1;
                Red += matrix[i + row][j + col].rgbtRed * 1;
            }
        }
    }

    new_matrix[row][col].rgbtBlue = fabsf(Blue);
    new_matrix[row][col].rgbtGreen = fabsf(Green);
    new_matrix[row][col].rgbtRed = fabsf(Red);
}

r_sqrt_sum函数:

int r_sqrt_sum(float a, float b)
// Return rounded sqrt of sum of squared a and b.
{
    float x = round(sqrt((a*a + b*b)));

    if (x > 255) return 255;

    else return x;
}

Link to the problem (edges part only) here.

In this code I am using sobel operator to identify the edged in a bmp image.

I have tried various different things, the code compiles correctly (there is no error), and also the output image obtained shows the edges of the pixels , it looks like the sobel filter is applied correctly , but when I check my code , it is not matching with the answer.
Please help me find the error in my code which is responsible for the same.
Thanks.

Here is the main code of the function:

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

    // Array for storing corresponding gx values of the pixels.
    RGBTRIPLE(*gx)[width] = calloc(height, width * sizeof(RGBTRIPLE));
    if (gx == NULL)
    {
        printf("Not enough memory to store blur pixels.\n");
        return;
    }

    // Array for storing corresponding gy values of the pixels.
    RGBTRIPLE(*gy)[width] = calloc(height, width * sizeof(RGBTRIPLE));
    if (gy == NULL)
    {
        printf("Not enough memory to store blur pixels.\n");
        return;
    }


    for (int row = 0; row < height; row++)
    {
        for (int col = 0; col < width; col++)
        {
            Gx(row, col, height, width, image, gx);
            Gy(row, col, height, width, image, gy);
        }
    }

    for (int row = 0; row < height; row++)
    {
        for (int col = 0; col < width; col++)
        {
            image[row][col].rgbtBlue = r_sqrt_sum(gx[row][col].rgbtBlue, gy[row][col].rgbtBlue);
            image[row][col].rgbtGreen = r_sqrt_sum(gx[row][col].rgbtGreen, gy[row][col].rgbtGreen);
            image[row][col].rgbtRed = r_sqrt_sum(gx[row][col].rgbtRed, gy[row][col].rgbtRed);

        }
    }

    free(gx);
    free(gy);
    return;
}

Declaration of gx and gy:

void Gx(int row, int col, int height, int width, RGBTRIPLE matrix[height][width], RGBTRIPLE new_matrix[height][width])
// This function will return Gx value of a given pixel.
{
    float Blue = 0;
    float Green = 0;
    float Red = 0;

    for (int i = -1; i < 2; i++)
    {
        for (int j = -1; j < 2; j++)
        {
            // for rows and columns out of range.
            if ((i + row) < 0 || (i + row >= height) || (j + col) < 0 || (j + col >= width))
            {
                continue;
            }

            // for (-1,-1) and (1,-1)
            else if ((i == -1 && j == -1) || (i == 1 && j == -1))
            {
                Blue += matrix[i + row][j + col].rgbtBlue * -1;
                Green += matrix[i + row][j + col].rgbtGreen * -1;
                Red += matrix[i + row][j + col].rgbtRed * -1;
            }

            // for (0,-1)
            else if ((i == 0 && j == -1))
            {
                Blue += matrix[i + row][j + col].rgbtBlue * -2;
                Green += matrix[i + row][j + col].rgbtGreen * -2;
                Red += matrix[i + row][j + col].rgbtRed * -2;
            }

            // for (-1, 0) , (0, 0), (1, 0)
            else if ((i == -1 && j == 0) || (i == 0 && j == 0) || (i == 1 && j == 0))
            {
                Blue += matrix[i + row][j + col].rgbtBlue * 0;
                Green += matrix[i + row][j + col].rgbtGreen * 0;
                Red += matrix[i + row][j + col].rgbtRed * 0;
            }

            // for (0, 1)
            else if ((i == 0 && j == 1))
            {
                Blue += matrix[i + row][j + col].rgbtBlue * 2;
                Green += matrix[i + row][j + col].rgbtGreen * 2;
                Red += matrix[i + row][j + col].rgbtRed * 2;
            }

            // for (-1,1) and (1,1)
            else if ((i == -1 && j == 1) || (i == 1 && j == 1))
            {
                Blue += matrix[i + row][j + col].rgbtBlue * 1;
                Green += matrix[i + row][j + col].rgbtGreen * 1;
                Red += matrix[i + row][j + col].rgbtRed * 1;
            }
        }
    }

    new_matrix[row][col].rgbtBlue = fabsf(Blue);
    new_matrix[row][col].rgbtGreen = fabsf(Green);
    new_matrix[row][col].rgbtRed = fabsf(Red);
}


void Gy(int row, int col, int height, int width, RGBTRIPLE matrix[height][width], RGBTRIPLE new_matrix[height][width])
// This function will return Gy value of a given pixel.
{
    float Blue = 0;
    float Green = 0;
    float Red = 0;

    for (int i = -1; i < 2; i++)
    {
        for (int j = -1; j < 2; j++)
        {
            // for rows and columns out of range.
            if ((i + row) < 0 || (i + row >= height) || (j + col) < 0 || (j + col >= width))
            {
                continue;
            }

            // for (-1,-1) and (-1,1)
            else if ((i == -1 && j == -1) || (i == -1 && j == 1))
            {
                Blue += matrix[i + row][j + col].rgbtBlue * -1;
                Green += matrix[i + row][j + col].rgbtGreen * -1;
                Red += matrix[i + row][j + col].rgbtRed * -1;
            }

            // for (0, -1)
            else if ((i == 0 && j == -1))
            {
                Blue += matrix[i + row][j + col].rgbtBlue * -2;
                Green += matrix[i + row][j + col].rgbtGreen * -2;
                Red += matrix[i + row][j + col].rgbtRed * -2;
            }

            // for (0, -1) , (0, 0), (0, 1)
            else if ((i == 0 && j == -1) || (i == 0 && j == 0) || (i == 0 && j == 1))
            {
                Blue += matrix[i + row][j + col].rgbtBlue * 0;
                Green += matrix[i + row][j + col].rgbtGreen * 0;
                Red += matrix[i + row][j + col].rgbtRed * 0;
            }

            // for (1, 0)
            else if ((i ==1 && j == 0))
            {
                Blue += matrix[i + row][j + col].rgbtBlue * 2;
                Green += matrix[i + row][j + col].rgbtGreen * 2;
                Red += matrix[i + row][j + col].rgbtRed * 2;
            }

            // for (1,-1) and (1,1)
            else if ((i == 1 && j == -1) || (i == 1 && j == 1))
            {
                Blue += matrix[i + row][j + col].rgbtBlue * 1;
                Green += matrix[i + row][j + col].rgbtGreen * 1;
                Red += matrix[i + row][j + col].rgbtRed * 1;
            }
        }
    }

    new_matrix[row][col].rgbtBlue = fabsf(Blue);
    new_matrix[row][col].rgbtGreen = fabsf(Green);
    new_matrix[row][col].rgbtRed = fabsf(Red);
}

r_sqrt_sum function:

int r_sqrt_sum(float a, float b)
// Return rounded sqrt of sum of squared a and b.
{
    float x = round(sqrt((a*a + b*b)));

    if (x > 255) return 255;

    else return x;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文