为什么 CS50 的滤镜(less)(PSET 4)中的模糊功能没有返回正确的值?
目前卡在 CS50 的 PSET 4 过滤器上较少。为了创建模糊函数,我想出了 9 种可能的情况,其中像素可能出现在图像中(例如,在第一行和第一列中)。但是,当我使用 check50 检查代码时,函数返回的值与预期值不同。我已经多次查看了我的代码,但我不太明白问题出在哪里,并希望有第二双眼睛来帮助我。提前致谢。
#include "helpers.h"
#include <math.h>
// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width])
{
// Copy 2D image array into a new array to work with
RGBTRIPLE copy[height][width];
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
copy[i][j] = image[i][j];
}
}
// Determine case and respond accordingly
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
// CASE 1: Pixel is not in 1st/last row AND not in 1st/LAST column
if (0 < j < width - 1 && 0 < i < height - 1 )
{
int R1 = round((copy[i-1][j-1].rgbtRed + copy[i-1][j].rgbtRed + copy[i-1][j+1].rgbtRed + copy[i][j-1].rgbtRed + copy[i][j].rgbtRed + copy[i][j+1].rgbtRed + copy[i+1][j-1].rgbtRed + copy[i+1][j].rgbtRed + copy[i+1][j+1].rgbtRed)/9.0);
int G1 = round((copy[i-1][j-1].rgbtGreen + copy[i-1][j].rgbtGreen + copy[i-1][j+1].rgbtGreen + copy[i][j-1].rgbtGreen + copy[i][j].rgbtGreen + copy[i][j+1].rgbtGreen + copy[i+1][j-1].rgbtGreen + copy[i+1][j].rgbtGreen + copy[i+1][j+1].rgbtGreen)/9.0);
int B1 = round((copy[i-1][j-1].rgbtBlue + copy[i-1][j].rgbtBlue + copy[i-1][j+1].rgbtBlue + copy[i][j-1].rgbtBlue + copy[i][j].rgbtBlue + copy[i][j+1].rgbtBlue + copy[i+1][j-1].rgbtBlue + copy[i+1][j].rgbtBlue + copy[i+1][j+1].rgbtBlue)/9.0);
image[i][j].rgbtRed = R1;
image[i][j].rgbtGreen = G1;
image[i][j].rgbtBlue = B1;
}
// CASE 2: Pixel in 1st row, 1st column
else if (i == 0 && j == 0)
{
int R2 = round((copy[i][j].rgbtRed + copy[i][j+1].rgbtRed + copy[i+1][j].rgbtRed + copy[i+1][j+1].rgbtRed)/4.0);
int B2 = round((copy[i][j].rgbtBlue + copy[i][j+1].rgbtBlue + copy[i+1][j].rgbtBlue + copy[i+1][j+1].rgbtBlue)/4.0);
int G2 = round((copy[i][j].rgbtGreen + copy[i][j+1].rgbtGreen + copy[i+1][j].rgbtGreen + copy[i+1][j+1].rgbtGreen)/4.0);
image[i][j].rgbtRed = R2;
image[i][j].rgbtGreen = G2;
image[i][j].rgbtBlue = B2;
}
// CASE 3: Pixel in 1st row, NOT 1ST/LAST COLUMN
else if (i == 0 && 0 < j < width - 1)
{
int R3 = round((copy[i][j-1].rgbtRed + copy[i][j].rgbtRed + copy[i][j+1].rgbtRed + copy[i+1][j-1].rgbtRed + copy[i+1][j].rgbtRed + copy[i+1][j+1].rgbtRed)/6.0);
int G3 = round((copy[i][j-1].rgbtGreen + copy[i][j].rgbtGreen + copy[i][j+1].rgbtGreen + copy[i+1][j-1].rgbtGreen + copy[i+1][j].rgbtGreen + copy[i+1][j+1].rgbtGreen)/6.0);
int B3 = round((copy[i][j-1].rgbtBlue + copy[i][j].rgbtBlue + copy[i][j+1].rgbtBlue + copy[i+1][j-1].rgbtBlue + copy[i+1][j].rgbtBlue + copy[i+1][j+1].rgbtBlue)/6.0);
image[i][j].rgbtRed = R3;
image[i][j].rgbtGreen = G3;
image[i][j].rgbtBlue = B3;
}
// CASE 4: PIXEL IN 1ST ROW, LAST COLUMN
else if (i == 0 && j == width - 1)
{
int R4 = round((copy[i][j-1].rgbtRed + copy[i][j].rgbtRed + copy[i+1][j].rgbtRed + copy[i+1][j-1].rgbtRed)/4.0);
int B4 = round((copy[i][j-1].rgbtBlue + copy[i][j].rgbtBlue + copy[i+1][j].rgbtBlue + copy[i+1][j-1].rgbtBlue)/4.0);
int G4 = round((copy[i][j-1].rgbtGreen + copy[i][j].rgbtGreen + copy[i+1][j].rgbtGreen + copy[i+1][j-1].rgbtGreen)/4.0);
image[i][j].rgbtRed = R4;
image[i][j].rgbtGreen = G4;
image[i][j].rgbtBlue = B4;
}
// CASE 5: PIXEL NOT IN 1ST/LAST ROW, IN 1ST COLUMN
else if (0 < i < height - 1 && j == 0)
{
int R5 = round((copy[i-1][j].rgbtRed + copy[i-1][j+1].rgbtRed + copy[i][j].rgbtRed + copy[i][j+1].rgbtRed + copy[i+1][j].rgbtRed + copy[i+1][j+1].rgbtRed)/6.0);
int G5 = round((copy[i-1][j].rgbtBlue + copy[i-1][j+1].rgbtBlue + copy[i][j].rgbtBlue + copy[i][j+1].rgbtBlue + copy[i+1][j].rgbtBlue + copy[i+1][j+1].rgbtBlue)/6.0);
int B5 = round((copy[i-1][j].rgbtGreen + copy[i-1][j+1].rgbtGreen + copy[i][j].rgbtGreen + copy[i][j+1].rgbtGreen + copy[i+1][j].rgbtGreen + copy[i+1][j+1].rgbtGreen)/6.0);
image[i][j].rgbtRed = R5;
image[i][j].rgbtGreen = G5;
image[i][j].rgbtBlue = B5;
}
// CASE 6: PIXEL IN LAST ROW, 1ST COLUMN
else if (i == height - 1 && j == 0)
{
int R6 = round((copy[i-1][j].rgbtRed + copy[i-1][j+1].rgbtRed + copy[i][j].rgbtRed + copy[i][j+1].rgbtRed)/4.0);
int B6 = round((copy[i-1][j].rgbtBlue + copy[i-1][j+1].rgbtBlue + copy[i][j].rgbtBlue + copy[i][j+1].rgbtBlue)/4.0);
int G6 = round((copy[i-1][j].rgbtGreen + copy[i-1][j+1].rgbtGreen + copy[i][j].rgbtGreen + copy[i][j+1].rgbtGreen)/4.0);
image[i][j].rgbtRed = R6;
image[i][j].rgbtGreen = G6;
image[i][j].rgbtBlue = B6;
}
// CASE 7: Pixel IN LAST ROW, LAST COLUMN
else if (i == height - 1 && j == width - 1)
{
int R7 = round((copy[i-1][j].rgbtRed + copy[i-1][j-1].rgbtRed + copy[i][j].rgbtRed + copy[i][j-1].rgbtRed)/4.0);
int B7 = round((copy[i-1][j].rgbtBlue + copy[i-1][j-1].rgbtBlue + copy[i][j].rgbtBlue + copy[i][j-1].rgbtBlue)/4.0);
int G7 = round((copy[i-1][j].rgbtGreen + copy[i-1][j-1].rgbtGreen + copy[i][j].rgbtGreen + copy[i][j-1].rgbtGreen)/4.0);
image[i][j].rgbtRed = R7;
image[i][j].rgbtGreen = G7;
image[i][j].rgbtBlue = B7;
}
// CASE 8: PIXEL IN LAST ROW, NOT LAST / 1ST COLUMN
else if (i == height - 1 && 0 < j < width - 1)
{
int R8 = round((copy[i][j-1].rgbtRed + copy[i][j].rgbtRed + copy[i][j+1].rgbtRed + copy[i-1][j-1].rgbtRed + copy[i-1][j].rgbtRed + copy[i-1][j+1].rgbtRed)/6.0);
int G8 = round((copy[i][j-1].rgbtGreen + copy[i][j].rgbtGreen + copy[i][j+1].rgbtGreen + copy[i-1][j-1].rgbtGreen + copy[i-1][j].rgbtGreen + copy[i-1][j+1].rgbtGreen)/6.0);
int B8 = round((copy[i][j-1].rgbtBlue + copy[i][j].rgbtBlue + copy[i][j+1].rgbtBlue + copy[i-1][j-1].rgbtBlue + copy[i-1][j].rgbtBlue + copy[i-1][j+1].rgbtBlue)/6.0);
image[i][j].rgbtRed = R8;
image[i][j].rgbtGreen = G8;
image[i][j].rgbtBlue = B8;
}
// CASE 9: PIXEL IN LAST COLUMN, NOT 1ST / LAST ROW
else if (0 < i < height - 1 && j == width - 1 )
{
int R9 = round((copy[i-1][j].rgbtRed + copy[i-1][j-1].rgbtRed + copy[i][j].rgbtRed + copy[i][j-1].rgbtRed + copy[i+1][j].rgbtRed + copy[i+1][j-1].rgbtRed)/6.0);
int G9 = round((copy[i-1][j].rgbtBlue + copy[i-1][j-1].rgbtBlue + copy[i][j].rgbtBlue + copy[i][j-1].rgbtBlue + copy[i+1][j].rgbtBlue + copy[i+1][j-1].rgbtBlue)/6.0);
int B9 = round((copy[i-1][j].rgbtGreen + copy[i-1][j-1].rgbtGreen + copy[i][j].rgbtGreen + copy[i][j-1].rgbtGreen + copy[i+1][j].rgbtGreen + copy[i+1][j-1].rgbtGreen)/6.0);
image[i][j].rgbtRed = R9;
image[i][j].rgbtGreen = G9;
image[i][j].rgbtBlue = B9;
}
}
}
}
起初,我认为问题是由于使用相同的变量名称来存储新的 RGB 值,因此我创建了唯一的变量名称来存储 9 种情况中每种情况的 RGB 值(例如 R1 R2 R3 ...)。然而,事实并非如此。
currently stuck on CS50's PSET 4 filter less. To create the blur function, I came up with 9 possible cases of where a pixel could in an image (eg in 1st row and 1st column). However, when I used check50 to check my code, the values the function returns are different from the expected values. I have looked through my code multiple times but I can't quite see where the problem lies and was hoping for a second pair of eyes to help me out. Thanks in advance.
#include "helpers.h"
#include <math.h>
// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width])
{
// Copy 2D image array into a new array to work with
RGBTRIPLE copy[height][width];
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
copy[i][j] = image[i][j];
}
}
// Determine case and respond accordingly
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
// CASE 1: Pixel is not in 1st/last row AND not in 1st/LAST column
if (0 < j < width - 1 && 0 < i < height - 1 )
{
int R1 = round((copy[i-1][j-1].rgbtRed + copy[i-1][j].rgbtRed + copy[i-1][j+1].rgbtRed + copy[i][j-1].rgbtRed + copy[i][j].rgbtRed + copy[i][j+1].rgbtRed + copy[i+1][j-1].rgbtRed + copy[i+1][j].rgbtRed + copy[i+1][j+1].rgbtRed)/9.0);
int G1 = round((copy[i-1][j-1].rgbtGreen + copy[i-1][j].rgbtGreen + copy[i-1][j+1].rgbtGreen + copy[i][j-1].rgbtGreen + copy[i][j].rgbtGreen + copy[i][j+1].rgbtGreen + copy[i+1][j-1].rgbtGreen + copy[i+1][j].rgbtGreen + copy[i+1][j+1].rgbtGreen)/9.0);
int B1 = round((copy[i-1][j-1].rgbtBlue + copy[i-1][j].rgbtBlue + copy[i-1][j+1].rgbtBlue + copy[i][j-1].rgbtBlue + copy[i][j].rgbtBlue + copy[i][j+1].rgbtBlue + copy[i+1][j-1].rgbtBlue + copy[i+1][j].rgbtBlue + copy[i+1][j+1].rgbtBlue)/9.0);
image[i][j].rgbtRed = R1;
image[i][j].rgbtGreen = G1;
image[i][j].rgbtBlue = B1;
}
// CASE 2: Pixel in 1st row, 1st column
else if (i == 0 && j == 0)
{
int R2 = round((copy[i][j].rgbtRed + copy[i][j+1].rgbtRed + copy[i+1][j].rgbtRed + copy[i+1][j+1].rgbtRed)/4.0);
int B2 = round((copy[i][j].rgbtBlue + copy[i][j+1].rgbtBlue + copy[i+1][j].rgbtBlue + copy[i+1][j+1].rgbtBlue)/4.0);
int G2 = round((copy[i][j].rgbtGreen + copy[i][j+1].rgbtGreen + copy[i+1][j].rgbtGreen + copy[i+1][j+1].rgbtGreen)/4.0);
image[i][j].rgbtRed = R2;
image[i][j].rgbtGreen = G2;
image[i][j].rgbtBlue = B2;
}
// CASE 3: Pixel in 1st row, NOT 1ST/LAST COLUMN
else if (i == 0 && 0 < j < width - 1)
{
int R3 = round((copy[i][j-1].rgbtRed + copy[i][j].rgbtRed + copy[i][j+1].rgbtRed + copy[i+1][j-1].rgbtRed + copy[i+1][j].rgbtRed + copy[i+1][j+1].rgbtRed)/6.0);
int G3 = round((copy[i][j-1].rgbtGreen + copy[i][j].rgbtGreen + copy[i][j+1].rgbtGreen + copy[i+1][j-1].rgbtGreen + copy[i+1][j].rgbtGreen + copy[i+1][j+1].rgbtGreen)/6.0);
int B3 = round((copy[i][j-1].rgbtBlue + copy[i][j].rgbtBlue + copy[i][j+1].rgbtBlue + copy[i+1][j-1].rgbtBlue + copy[i+1][j].rgbtBlue + copy[i+1][j+1].rgbtBlue)/6.0);
image[i][j].rgbtRed = R3;
image[i][j].rgbtGreen = G3;
image[i][j].rgbtBlue = B3;
}
// CASE 4: PIXEL IN 1ST ROW, LAST COLUMN
else if (i == 0 && j == width - 1)
{
int R4 = round((copy[i][j-1].rgbtRed + copy[i][j].rgbtRed + copy[i+1][j].rgbtRed + copy[i+1][j-1].rgbtRed)/4.0);
int B4 = round((copy[i][j-1].rgbtBlue + copy[i][j].rgbtBlue + copy[i+1][j].rgbtBlue + copy[i+1][j-1].rgbtBlue)/4.0);
int G4 = round((copy[i][j-1].rgbtGreen + copy[i][j].rgbtGreen + copy[i+1][j].rgbtGreen + copy[i+1][j-1].rgbtGreen)/4.0);
image[i][j].rgbtRed = R4;
image[i][j].rgbtGreen = G4;
image[i][j].rgbtBlue = B4;
}
// CASE 5: PIXEL NOT IN 1ST/LAST ROW, IN 1ST COLUMN
else if (0 < i < height - 1 && j == 0)
{
int R5 = round((copy[i-1][j].rgbtRed + copy[i-1][j+1].rgbtRed + copy[i][j].rgbtRed + copy[i][j+1].rgbtRed + copy[i+1][j].rgbtRed + copy[i+1][j+1].rgbtRed)/6.0);
int G5 = round((copy[i-1][j].rgbtBlue + copy[i-1][j+1].rgbtBlue + copy[i][j].rgbtBlue + copy[i][j+1].rgbtBlue + copy[i+1][j].rgbtBlue + copy[i+1][j+1].rgbtBlue)/6.0);
int B5 = round((copy[i-1][j].rgbtGreen + copy[i-1][j+1].rgbtGreen + copy[i][j].rgbtGreen + copy[i][j+1].rgbtGreen + copy[i+1][j].rgbtGreen + copy[i+1][j+1].rgbtGreen)/6.0);
image[i][j].rgbtRed = R5;
image[i][j].rgbtGreen = G5;
image[i][j].rgbtBlue = B5;
}
// CASE 6: PIXEL IN LAST ROW, 1ST COLUMN
else if (i == height - 1 && j == 0)
{
int R6 = round((copy[i-1][j].rgbtRed + copy[i-1][j+1].rgbtRed + copy[i][j].rgbtRed + copy[i][j+1].rgbtRed)/4.0);
int B6 = round((copy[i-1][j].rgbtBlue + copy[i-1][j+1].rgbtBlue + copy[i][j].rgbtBlue + copy[i][j+1].rgbtBlue)/4.0);
int G6 = round((copy[i-1][j].rgbtGreen + copy[i-1][j+1].rgbtGreen + copy[i][j].rgbtGreen + copy[i][j+1].rgbtGreen)/4.0);
image[i][j].rgbtRed = R6;
image[i][j].rgbtGreen = G6;
image[i][j].rgbtBlue = B6;
}
// CASE 7: Pixel IN LAST ROW, LAST COLUMN
else if (i == height - 1 && j == width - 1)
{
int R7 = round((copy[i-1][j].rgbtRed + copy[i-1][j-1].rgbtRed + copy[i][j].rgbtRed + copy[i][j-1].rgbtRed)/4.0);
int B7 = round((copy[i-1][j].rgbtBlue + copy[i-1][j-1].rgbtBlue + copy[i][j].rgbtBlue + copy[i][j-1].rgbtBlue)/4.0);
int G7 = round((copy[i-1][j].rgbtGreen + copy[i-1][j-1].rgbtGreen + copy[i][j].rgbtGreen + copy[i][j-1].rgbtGreen)/4.0);
image[i][j].rgbtRed = R7;
image[i][j].rgbtGreen = G7;
image[i][j].rgbtBlue = B7;
}
// CASE 8: PIXEL IN LAST ROW, NOT LAST / 1ST COLUMN
else if (i == height - 1 && 0 < j < width - 1)
{
int R8 = round((copy[i][j-1].rgbtRed + copy[i][j].rgbtRed + copy[i][j+1].rgbtRed + copy[i-1][j-1].rgbtRed + copy[i-1][j].rgbtRed + copy[i-1][j+1].rgbtRed)/6.0);
int G8 = round((copy[i][j-1].rgbtGreen + copy[i][j].rgbtGreen + copy[i][j+1].rgbtGreen + copy[i-1][j-1].rgbtGreen + copy[i-1][j].rgbtGreen + copy[i-1][j+1].rgbtGreen)/6.0);
int B8 = round((copy[i][j-1].rgbtBlue + copy[i][j].rgbtBlue + copy[i][j+1].rgbtBlue + copy[i-1][j-1].rgbtBlue + copy[i-1][j].rgbtBlue + copy[i-1][j+1].rgbtBlue)/6.0);
image[i][j].rgbtRed = R8;
image[i][j].rgbtGreen = G8;
image[i][j].rgbtBlue = B8;
}
// CASE 9: PIXEL IN LAST COLUMN, NOT 1ST / LAST ROW
else if (0 < i < height - 1 && j == width - 1 )
{
int R9 = round((copy[i-1][j].rgbtRed + copy[i-1][j-1].rgbtRed + copy[i][j].rgbtRed + copy[i][j-1].rgbtRed + copy[i+1][j].rgbtRed + copy[i+1][j-1].rgbtRed)/6.0);
int G9 = round((copy[i-1][j].rgbtBlue + copy[i-1][j-1].rgbtBlue + copy[i][j].rgbtBlue + copy[i][j-1].rgbtBlue + copy[i+1][j].rgbtBlue + copy[i+1][j-1].rgbtBlue)/6.0);
int B9 = round((copy[i-1][j].rgbtGreen + copy[i-1][j-1].rgbtGreen + copy[i][j].rgbtGreen + copy[i][j-1].rgbtGreen + copy[i+1][j].rgbtGreen + copy[i+1][j-1].rgbtGreen)/6.0);
image[i][j].rgbtRed = R9;
image[i][j].rgbtGreen = G9;
image[i][j].rgbtBlue = B9;
}
}
}
}
At first, I thought that the problem was due to using the same variable names to store the new RGB values so I created unique variable names to store the RGB values for each of the 9 cases (eg. R1 R2 R3 ...). However, this was not the case.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我认为主要问题是关系运算符不能按您希望的方式工作。
具体来说;对于像
0
0
这样的条件我< height
编译器从左到右计算它,如(0 < i) < height
,其中第一部分变为 true 或 false,第二部分与 true 或 false 进行比较,而不是与i
进行比较(例如TRUE < height
) 。要解决此问题,您必须在关系运算符之间使用布尔运算符,例如
(0 < i) && (i<高度)
。作为替代方案;您可以删除所有分支并按顺序执行像素;喜欢:
I think the main problem is that relational operators don't work how you hope.
Specifically; for a condition like
0 < i < height
the compiler evaluates it from left to right, like(0 < i) < height
, where the first part becomes true or false and the second part is comparing against true of false and not comparing againsti
(likeTRUE < height
).To fix this, you have to use a boolean operator between the relational operators, like
(0 < i) && (i < height)
.As an alternative; you could delete all the branches and just do pixels in order; like: