在我的代码中找不到函数“Edges”的 CS50x 问题集 4“filter-more”的错误

问题描述 投票:0回答:1

我最初在纸上写了这段代码,据我所知,应该可以工作,但我得到了错误的输出。 文件内:https://imgur.com/oIffo7o 输出文件:https://imgur.com/rCNvW3L 感谢任何形式的帮助



void edges(int height, int width, RGBTRIPLE image[height][width])
{
    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 y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            int sumGx[3] = {0, 0, 0};
            int sumGy[3] = {0, 0, 0};

            for (int dy = -1; dy <= 1; dy++)
            {
                for (int dx = -1; dx <= 1; dx++)
                {
                    int ky = y + dy;
                    int kx = x + dx;

                    if ((ky > 0 && ky < height) && (kx > 0 && kx < width))
                    {
                        sumGx[0] += Gx[dy + 1][dx + 1] * image[ky][kx].rgbtRed;
                        sumGx[1] += Gx[dy + 1][dx + 1] * image[ky][kx].rgbtGreen;
                        sumGx[2] += Gx[dy + 1][dx + 1] * image[ky][kx].rgbtBlue;

                        sumGy[0] += Gy[dy + 1][dx + 1] * image[ky][kx].rgbtRed;
                        sumGy[1] += Gy[dy + 1][dx + 1] * image[ky][kx].rgbtGreen;
                        sumGy[2] += Gy[dy + 1][dx + 1] * image[ky][kx].rgbtBlue;
                    }
                }
            }

            int pixel_value[3] = {0, 0, 0};

            for (int i = 0; i < 3; i++)
            {
                if ((sumGx[i] != 0) && (sumGy[i] != 0))
                {
                    int squaredGx = sumGx[i] * sumGx[i];
                    int squaredGy = sumGy[i] * sumGy[i];
                    int edge = round(sqrt(squaredGx + squaredGy));

                    pixel_value[i] = edge > 255 ? 255 : edge;
                }
            }
            image[y][x].rgbtRed = pixel_value[0];
            image[y][x].rgbtGreen = pixel_value[1];
            image[y][x].rgbtBlue = pixel_value[2];
        }
    }

这是 RGBTRIPLE 的代码:

typedef struct
{
    BYTE  rgbtBlue;
    BYTE  rgbtGreen;
    BYTE  rgbtRed;
} __attribute__((__packed__))
RGBTRIPLE;
c debugging cs50 sobel
1个回答
0
投票

所以我发现我做错了什么,我必须创建原始图像的复制图像。然后对复制图像应用 Sobel 算子,同时将值赋给图像[y][x]像素。这样我们就可以避免原始图像中的结果出现偏差。 我之前编写的代码是更改每个像素的值,对于后续像素,它将使用覆盖的值,从而为整个图像产生不同的结果。

这是对代码的添加:

  void edges(int height, int width, RGBTRIPLE image[height][width])
 {
 RGBTRIPLE original[height][width];
 memcpy(original, image, sizeof(RGBTRIPLE)*height*width);

 //* Existing code

      if ((ky >= 0 && ky < height) && (kx >= 0 && kx < width))
                {
                    sumGx[0] += Gx[dy + 1][dx + 1] * original[ky][kx].rgbtRed;
                    sumGx[1] += Gx[dy + 1][dx + 1] * original[ky][kx].rgbtGreen;
                    sumGx[2] += Gx[dy + 1][dx + 1] * original[ky][kx].rgbtBlue;

                    sumGy[0] += Gy[dy + 1][dx + 1] * original[ky][kx].rgbtRed;
                    sumGy[1] += Gy[dy + 1][dx + 1] * original[ky][kx].rgbtGreen;
                    sumGy[2] += Gy[dy + 1][dx + 1] * original[ky][kx].rgbtBlue;
                } 
       // Rest of the code
       // Squaring and finding the value for each pixel using squaredGx and 
      squaredGy, and assigning the value to image[y][x]
}

这应该可以。这些添加解决了我面临的问题。

© www.soinside.com 2019 - 2024. All rights reserved.