CS50 PSET4 FILFER-MORE:EDGES()函数(在某种程度上过滤图像,但与答案不匹配。)
链接到问题(仅边零件)在这里。
在此代码中,我使用SOBEL操作员来识别BMP图像中的边缘。
我尝试了各种不同的事情,正确编译了代码(没有错误),并且获得的输出图像显示了像素的边缘,看起来像是正确应用Sobel filter,但是当我检查我的代码时,它是与答案不匹配。 请帮助我在代码中找到错误的错误。 谢谢。
这是函数的主要代码:
// Detect edges
void edges(int height, int width, RGBTRIPLE image[height][width])
{
// Array for storing corresponding gx values of the pixels.
RGBTRIPLE(*gx)[width] = calloc(height, width * sizeof(RGBTRIPLE));
if (gx == NULL)
{
printf("Not enough memory to store blur pixels.\n");
return;
}
// Array for storing corresponding gy values of the pixels.
RGBTRIPLE(*gy)[width] = calloc(height, width * sizeof(RGBTRIPLE));
if (gy == NULL)
{
printf("Not enough memory to store blur pixels.\n");
return;
}
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
Gx(row, col, height, width, image, gx);
Gy(row, col, height, width, image, gy);
}
}
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
image[row][col].rgbtBlue = r_sqrt_sum(gx[row][col].rgbtBlue, gy[row][col].rgbtBlue);
image[row][col].rgbtGreen = r_sqrt_sum(gx[row][col].rgbtGreen, gy[row][col].rgbtGreen);
image[row][col].rgbtRed = r_sqrt_sum(gx[row][col].rgbtRed, gy[row][col].rgbtRed);
}
}
free(gx);
free(gy);
return;
}
gx和gy的声明:
void Gx(int row, int col, int height, int width, RGBTRIPLE matrix[height][width], RGBTRIPLE new_matrix[height][width])
// This function will return Gx value of a given pixel.
{
float Blue = 0;
float Green = 0;
float Red = 0;
for (int i = -1; i < 2; i++)
{
for (int j = -1; j < 2; j++)
{
// for rows and columns out of range.
if ((i + row) < 0 || (i + row >= height) || (j + col) < 0 || (j + col >= width))
{
continue;
}
// for (-1,-1) and (1,-1)
else if ((i == -1 && j == -1) || (i == 1 && j == -1))
{
Blue += matrix[i + row][j + col].rgbtBlue * -1;
Green += matrix[i + row][j + col].rgbtGreen * -1;
Red += matrix[i + row][j + col].rgbtRed * -1;
}
// for (0,-1)
else if ((i == 0 && j == -1))
{
Blue += matrix[i + row][j + col].rgbtBlue * -2;
Green += matrix[i + row][j + col].rgbtGreen * -2;
Red += matrix[i + row][j + col].rgbtRed * -2;
}
// for (-1, 0) , (0, 0), (1, 0)
else if ((i == -1 && j == 0) || (i == 0 && j == 0) || (i == 1 && j == 0))
{
Blue += matrix[i + row][j + col].rgbtBlue * 0;
Green += matrix[i + row][j + col].rgbtGreen * 0;
Red += matrix[i + row][j + col].rgbtRed * 0;
}
// for (0, 1)
else if ((i == 0 && j == 1))
{
Blue += matrix[i + row][j + col].rgbtBlue * 2;
Green += matrix[i + row][j + col].rgbtGreen * 2;
Red += matrix[i + row][j + col].rgbtRed * 2;
}
// for (-1,1) and (1,1)
else if ((i == -1 && j == 1) || (i == 1 && j == 1))
{
Blue += matrix[i + row][j + col].rgbtBlue * 1;
Green += matrix[i + row][j + col].rgbtGreen * 1;
Red += matrix[i + row][j + col].rgbtRed * 1;
}
}
}
new_matrix[row][col].rgbtBlue = fabsf(Blue);
new_matrix[row][col].rgbtGreen = fabsf(Green);
new_matrix[row][col].rgbtRed = fabsf(Red);
}
void Gy(int row, int col, int height, int width, RGBTRIPLE matrix[height][width], RGBTRIPLE new_matrix[height][width])
// This function will return Gy value of a given pixel.
{
float Blue = 0;
float Green = 0;
float Red = 0;
for (int i = -1; i < 2; i++)
{
for (int j = -1; j < 2; j++)
{
// for rows and columns out of range.
if ((i + row) < 0 || (i + row >= height) || (j + col) < 0 || (j + col >= width))
{
continue;
}
// for (-1,-1) and (-1,1)
else if ((i == -1 && j == -1) || (i == -1 && j == 1))
{
Blue += matrix[i + row][j + col].rgbtBlue * -1;
Green += matrix[i + row][j + col].rgbtGreen * -1;
Red += matrix[i + row][j + col].rgbtRed * -1;
}
// for (0, -1)
else if ((i == 0 && j == -1))
{
Blue += matrix[i + row][j + col].rgbtBlue * -2;
Green += matrix[i + row][j + col].rgbtGreen * -2;
Red += matrix[i + row][j + col].rgbtRed * -2;
}
// for (0, -1) , (0, 0), (0, 1)
else if ((i == 0 && j == -1) || (i == 0 && j == 0) || (i == 0 && j == 1))
{
Blue += matrix[i + row][j + col].rgbtBlue * 0;
Green += matrix[i + row][j + col].rgbtGreen * 0;
Red += matrix[i + row][j + col].rgbtRed * 0;
}
// for (1, 0)
else if ((i ==1 && j == 0))
{
Blue += matrix[i + row][j + col].rgbtBlue * 2;
Green += matrix[i + row][j + col].rgbtGreen * 2;
Red += matrix[i + row][j + col].rgbtRed * 2;
}
// for (1,-1) and (1,1)
else if ((i == 1 && j == -1) || (i == 1 && j == 1))
{
Blue += matrix[i + row][j + col].rgbtBlue * 1;
Green += matrix[i + row][j + col].rgbtGreen * 1;
Red += matrix[i + row][j + col].rgbtRed * 1;
}
}
}
new_matrix[row][col].rgbtBlue = fabsf(Blue);
new_matrix[row][col].rgbtGreen = fabsf(Green);
new_matrix[row][col].rgbtRed = fabsf(Red);
}
r_sqrt_sum函数:
int r_sqrt_sum(float a, float b)
// Return rounded sqrt of sum of squared a and b.
{
float x = round(sqrt((a*a + b*b)));
if (x > 255) return 255;
else return x;
}
Link to the problem (edges part only) here.
In this code I am using sobel operator to identify the edged in a bmp image.
I have tried various different things, the code compiles correctly (there is no error), and also the output image obtained shows the edges of the pixels , it looks like the sobel filter is applied correctly , but when I check my code , it is not matching with the answer.
Please help me find the error in my code which is responsible for the same.
Thanks.
Here is the main code of the function:
// Detect edges
void edges(int height, int width, RGBTRIPLE image[height][width])
{
// Array for storing corresponding gx values of the pixels.
RGBTRIPLE(*gx)[width] = calloc(height, width * sizeof(RGBTRIPLE));
if (gx == NULL)
{
printf("Not enough memory to store blur pixels.\n");
return;
}
// Array for storing corresponding gy values of the pixels.
RGBTRIPLE(*gy)[width] = calloc(height, width * sizeof(RGBTRIPLE));
if (gy == NULL)
{
printf("Not enough memory to store blur pixels.\n");
return;
}
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
Gx(row, col, height, width, image, gx);
Gy(row, col, height, width, image, gy);
}
}
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
image[row][col].rgbtBlue = r_sqrt_sum(gx[row][col].rgbtBlue, gy[row][col].rgbtBlue);
image[row][col].rgbtGreen = r_sqrt_sum(gx[row][col].rgbtGreen, gy[row][col].rgbtGreen);
image[row][col].rgbtRed = r_sqrt_sum(gx[row][col].rgbtRed, gy[row][col].rgbtRed);
}
}
free(gx);
free(gy);
return;
}
Declaration of gx and gy:
void Gx(int row, int col, int height, int width, RGBTRIPLE matrix[height][width], RGBTRIPLE new_matrix[height][width])
// This function will return Gx value of a given pixel.
{
float Blue = 0;
float Green = 0;
float Red = 0;
for (int i = -1; i < 2; i++)
{
for (int j = -1; j < 2; j++)
{
// for rows and columns out of range.
if ((i + row) < 0 || (i + row >= height) || (j + col) < 0 || (j + col >= width))
{
continue;
}
// for (-1,-1) and (1,-1)
else if ((i == -1 && j == -1) || (i == 1 && j == -1))
{
Blue += matrix[i + row][j + col].rgbtBlue * -1;
Green += matrix[i + row][j + col].rgbtGreen * -1;
Red += matrix[i + row][j + col].rgbtRed * -1;
}
// for (0,-1)
else if ((i == 0 && j == -1))
{
Blue += matrix[i + row][j + col].rgbtBlue * -2;
Green += matrix[i + row][j + col].rgbtGreen * -2;
Red += matrix[i + row][j + col].rgbtRed * -2;
}
// for (-1, 0) , (0, 0), (1, 0)
else if ((i == -1 && j == 0) || (i == 0 && j == 0) || (i == 1 && j == 0))
{
Blue += matrix[i + row][j + col].rgbtBlue * 0;
Green += matrix[i + row][j + col].rgbtGreen * 0;
Red += matrix[i + row][j + col].rgbtRed * 0;
}
// for (0, 1)
else if ((i == 0 && j == 1))
{
Blue += matrix[i + row][j + col].rgbtBlue * 2;
Green += matrix[i + row][j + col].rgbtGreen * 2;
Red += matrix[i + row][j + col].rgbtRed * 2;
}
// for (-1,1) and (1,1)
else if ((i == -1 && j == 1) || (i == 1 && j == 1))
{
Blue += matrix[i + row][j + col].rgbtBlue * 1;
Green += matrix[i + row][j + col].rgbtGreen * 1;
Red += matrix[i + row][j + col].rgbtRed * 1;
}
}
}
new_matrix[row][col].rgbtBlue = fabsf(Blue);
new_matrix[row][col].rgbtGreen = fabsf(Green);
new_matrix[row][col].rgbtRed = fabsf(Red);
}
void Gy(int row, int col, int height, int width, RGBTRIPLE matrix[height][width], RGBTRIPLE new_matrix[height][width])
// This function will return Gy value of a given pixel.
{
float Blue = 0;
float Green = 0;
float Red = 0;
for (int i = -1; i < 2; i++)
{
for (int j = -1; j < 2; j++)
{
// for rows and columns out of range.
if ((i + row) < 0 || (i + row >= height) || (j + col) < 0 || (j + col >= width))
{
continue;
}
// for (-1,-1) and (-1,1)
else if ((i == -1 && j == -1) || (i == -1 && j == 1))
{
Blue += matrix[i + row][j + col].rgbtBlue * -1;
Green += matrix[i + row][j + col].rgbtGreen * -1;
Red += matrix[i + row][j + col].rgbtRed * -1;
}
// for (0, -1)
else if ((i == 0 && j == -1))
{
Blue += matrix[i + row][j + col].rgbtBlue * -2;
Green += matrix[i + row][j + col].rgbtGreen * -2;
Red += matrix[i + row][j + col].rgbtRed * -2;
}
// for (0, -1) , (0, 0), (0, 1)
else if ((i == 0 && j == -1) || (i == 0 && j == 0) || (i == 0 && j == 1))
{
Blue += matrix[i + row][j + col].rgbtBlue * 0;
Green += matrix[i + row][j + col].rgbtGreen * 0;
Red += matrix[i + row][j + col].rgbtRed * 0;
}
// for (1, 0)
else if ((i ==1 && j == 0))
{
Blue += matrix[i + row][j + col].rgbtBlue * 2;
Green += matrix[i + row][j + col].rgbtGreen * 2;
Red += matrix[i + row][j + col].rgbtRed * 2;
}
// for (1,-1) and (1,1)
else if ((i == 1 && j == -1) || (i == 1 && j == 1))
{
Blue += matrix[i + row][j + col].rgbtBlue * 1;
Green += matrix[i + row][j + col].rgbtGreen * 1;
Red += matrix[i + row][j + col].rgbtRed * 1;
}
}
}
new_matrix[row][col].rgbtBlue = fabsf(Blue);
new_matrix[row][col].rgbtGreen = fabsf(Green);
new_matrix[row][col].rgbtRed = fabsf(Red);
}
r_sqrt_sum function:
int r_sqrt_sum(float a, float b)
// Return rounded sqrt of sum of squared a and b.
{
float x = round(sqrt((a*a + b*b)));
if (x > 255) return 255;
else return x;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论