CS50 PSet4 - 模糊滤镜,我得到黑色图像作为输出

CS50 PSet4 - Blur Filter, I am getting black image as an output

我正在编写 pset4、滤镜、cs50 模糊的代码。但是我的输出图像是黑色的,或者它根本没有给出正确的输出。我一直 运行 解决这个问题。

我的模糊功能哪里做错了?

void blur(int height, int width, RGBTRIPLE image[height][width])
{
    RGBTRIPLE temp[height][width];
    int sumRed;
    int sumGreen;
    int sumBlue;
    int counter;

    for (int i = 0; i < width; i++)
    {
        for (int n = 0; n < height; n++)
        {
            //Resetting sums to 0
            sumRed = 0;
            sumGreen = 0;
            sumBlue = 0;
            counter = 0;

            for (int x = -1; x < 2; x++)
            {

                if (x + i < 0 || x + i > width - 1)
                {
                    continue;
                }

                for (int y = -1; y < 2; y++)
                {
                    if (y + n < 0 || y + n > height - 1)
                    {
                        continue;
                    }

                    sumRed += temp[y + n][x + i].rgbtRed;
                    sumGreen += temp[y + n][x + i].rgbtGreen;
                    sumBlue += temp[y + n][x + i].rgbtBlue;
                    counter++;

                }

            }

            temp[n][i].rgbtRed = round(sumRed / counter);
            temp[n][i].rgbtGreen = round(sumGreen / counter);
            temp[n][i].rgbtBlue = round(sumBlue / counter);
        }
    }

    for (int k = 0; k < width; k++)
    {
        for (int l = 0; l < height; l++)
        {
            image[l][k].rgbtRed = temp[k][l].rgbtRed;
            image[l][k].rgbtGreen = temp[k][l].rgbtGreen;
            image[l][k].rgbtBlue = temp[k][l].rgbtBlue;
        }
    }

    return;
}

黑屏的真正原因是temp没有初始化。要初始化它,我们可以简单地将 image 复制到 temp 中。感谢@Gerhardh 指出这一点。

RGBTRIPLE temp[height][width]; // create a temporary array to store a duplicate of image.

// save a new copy of image as temp per color.
for (int i = 0; i < height; i++) //Loop for height of image.
{
    for (int j = 0; j < width; j++) //Loop for width of image and save color values in temp.
    {
        temp[i][j] = image[i][j];
    }
}

你的算法还有一个问题。你在计算 temp 的同时改变了 temp 这是错误的。因为随着 temp 的变化,将对修改后的像素进行新的像素模糊计算。应始终对原始图像进行计算,然后应将图像分配给临时值。更详细的解释是.

基本上这段代码,

temp[n][i].rgbtRed = round(sumRed / counter);
temp[n][i].rgbtGreen = round(sumGreen / counter);
temp[n][i].rgbtBlue = round(sumBlue / counter);

应该是这个,

image[n][i].rgbtRed = round(sumRed / counter);
image[n][i].rgbtGreen = round(sumGreen / counter);
image[n][i].rgbtBlue = round(sumBlue / counter);

并删除它,因为我们已经在计算后立即进行赋值。

for (int k = 0; k < width; k++)
{
    for (int l = 0; l < height; l++)
    {
        image[l][k].rgbtRed = temp[k][l].rgbtRed;
        image[l][k].rgbtGreen = temp[k][l].rgbtGreen;
        image[l][k].rgbtBlue = temp[k][l].rgbtBlue;
    }
}