# CS50 Pset4 Filter (More comfortable) Edges Function

I am trying to code CS50's Pset4 Filter (More comfortable)'s edges function, but I keep on getting a different value.

This is the link to the video explaining what I am trying to do in this function, and I hope this would be easier to understand than me trying to explain everything. https://www.youtube.com/watch?v=PnVQN4vzC4U&list=PLhQjrBD2T382OwvMbZuaMGtD9wZkhnhYj&index=5

I have no problem compiling this code, but somehow I keep on getting a different value than what is expected.

This is the kind of output I got for a 4x4 image when I used check50. (I could not find any pattern in the output I am getting.)

It would be great if anyone can help me find a problem with this code. (Sorry, I am a coding beginner so the code might be difficult to understand or inefficient.)

``````void edges(int height, int width, RGBTRIPLE image[height][width])
{
// Creating a copy of the image

RGBTRIPLE cimage[height][width];

// Copying every RGB value of the original image to the copy

for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
cimage[i][j] = image[i][j];
}
}

// Creating an array for the algorithm that I am using

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 }};

// Creating a loop to modify the pixels one by one

for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
// Creating a loop to check each of the values of the surrounding pixels (a is the y value and b is the x value)

for (int a = -1; a < 2; a++)
{
// If the pixel that is being checked does not exist, skips the iteration to ignore the current pixel and go to the next pixel

if (i + a < 0 || i + a > height - 1)
{
continue;
}

for (int b = -1; b < 2; b++)
{
// If the pixel that is being checked does not exist, skips the iteration to ignore the current pixel and go to the next pixel

if (j + b < 0 || j + b > width - 1)
{
continue;
}

// Accumulating the Gx value for each color by multiplying the current pixel by the appropriate Gx value

int Gx = gx[a + 1][b + 1];
sumRedx += Gx * cimage[i + a][j + b].rgbtRed;
sumGreenx += Gx * cimage[i + a][j + b].rgbtGreen;
sumBluex += Gx * cimage[i + a][j + b].rgbtBlue;

// Accumulating the Gy value for each color by multiplying the current pixel by the appropriate Gy value

int Gy = gy[a + 1][b + 1];
sumRedy += Gy * cimage[i + a][j + b].rgbtRed;
sumGreeny += Gy * cimage[i + a][j + b].rgbtGreen;
sumBluey += Gy * cimage[i + a][j + b].rgbtBlue;
}
}

// Calculating the appropriate value for the pixel by taking the square root of (Gx^2 + Gy^2) and rounding that to the nearest integer

value = round(fmin(255,sqrt(sumRedx * sumRedx + sumRedy * sumRedy)));
image[i][j].rgbtRed = value;

// Iterating the same steps for Green and Blue values

value = round(fmin(255,sqrt(sumGreenx * sumGreenx + sumGreeny * sumGreeny)));
image[i][j].rgbtGreen = value;
value = round(fmin(255,sqrt(sumBluex * sumBluex + sumBluey * sumBluey)));
image[i][j].rgbtBlue = value;

// Resetting the values

int sumRedx = 0;
int sumGreenx = 0;
int sumBluex = 0;
int sumRedy = 0;
int sumGreeny = 0;
int sumBluey = 0;
}
}
return;
}
``````