// Detect edges
void edges(int height, int width, RGBTRIPLE image[height][width])
{
// Copying
RGBTRIPLE copy[height][width];
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
copy[i][j] = image[i][j];
}
}
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 i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
int GxsumRed = 0;
int GxsumGreen = 0;
int GxsumBlue = 0;
int GysumRed = 0;
int GysumGreen = 0;
int GysumBlue = 0;
// Forming 3x3 grid
int m = 0; // For Gx and Gy
for (int k = i - 1; k < i + 2; k++)
{
if (k < 0)
{
continue;
}
// if k > height then break
if (k >= height)
{
break;
}
int n = 0; // For Gx and Gy
for (int l = j - 1; l < j + 2; l++)
{
if (l < 0)
{
continue;
}
if (l >= width)
{
break;
}
GxsumRed += Gx[m][n] * copy[k][l].rgbtRed;
GxsumGreen += Gx[m][n] * copy[k][l].rgbtGreen;
GxsumBlue += Gx[m][n] * copy[k][l].rgbtBlue;
GysumRed += Gy[m][n] * copy[k][l].rgbtRed;
GysumGreen += Gy[m][n] * copy[k][l].rgbtGreen;
GysumBlue += Gy[m][n] * copy[k][l].rgbtBlue;
n++;
}
m++;
}
int newRed = round(sqrt((GxsumRed * GxsumRed) + (GysumRed * GysumRed)));
int newGreen = round(sqrt((GxsumGreen * GxsumGreen) + (GysumGreen * GysumGreen)));
int newBlue = round(sqrt((GxsumBlue * GxsumBlue) + (GysumBlue * GysumBlue)));
// Caping to 255
if (newRed > 255)
{
newRed = 255;
}
if (newGreen > 255)
{
newGreen = 255;
}
if (newBlue > 255)
{
newBlue = 255;
}
image[i][j].rgbtRed = newRed;
image[i][j].rgbtGreen = newGreen;
image[i][j].rgbtBlue = newBlue;
}
}
return;
}
此 CS50 问题集 4. 筛选更多问题。除了边缘功能之外,一切都很好。 ChatGPT 说我的代码是正确的,但 check50 说它不正确,为什么? 我做错了什么?
请问有人可以告诉我吗?拜托拜托?
这是所有详细信息:
最佳答案
问题是你增加 n
和m
在循环体的末尾,但是当 k < 0
时此增量被绕过或l < 0
分别为 true 和 continue
语句已被评估。
您应该避免 continue
语句或将增量移至 for
的第三个子句声明。
尽早脱离循环 if k >= height
或l >= width
是一种优化,它打破了代码的对称性,并使编译器更难以展开或并行化循环。即使对于中等大小的图像,这种优化也是微不足道的。建议优先考虑代码的可读性和规律性,而不是过早的优化。
这是内部循环的修改版本:
// Forming 3x3 grid
for (int m = 0; m < 3; m++)
{
int k = i - 1 + m;
if (k >= 0 && k < height)
{
for (int n = 0; n < 3; n++)
{
int l = j - 1 + n;
if (l >= 0 && l < width)
{
GxsumRed += Gx[m][n] * copy[k][l].rgbtRed;
GxsumGreen += Gx[m][n] * copy[k][l].rgbtGreen;
GxsumBlue += Gx[m][n] * copy[k][l].rgbtBlue;
GysumRed += Gy[m][n] * copy[k][l].rgbtRed;
GysumGreen += Gy[m][n] * copy[k][l].rgbtGreen;
GysumBlue += Gy[m][n] * copy[k][l].rgbtBlue;
}
}
}
}
关于check50 说 CS50 过滤器-更多边缘不正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77673824/