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;
}
}
我正在编写 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;
}
}