commit 384b8b3943234264697ced8b38dbeeef4d593cac Author: bot50 Date: Tue Mar 12 20:18:51 2024 +0000 kukemuna-cs50/problems/2024/x/filter/more@20240312T201851.384807059Z diff --git a/helpers.c b/helpers.c new file mode 100644 index 0000000..3e5c140 --- /dev/null +++ b/helpers.c @@ -0,0 +1,127 @@ +#include "helpers.h" +#include +#include + +// Convert image to grayscale +void grayscale(int height, int width, RGBTRIPLE image[height][width]) +{ + for (int i = 0; i < height; i++) + { + for (int j = 0; j < width; j++) + { + int avg = round((image[i][j].rgbtBlue + image[i][j].rgbtGreen + image[i][j].rgbtRed) / + (float) 3); + image[i][j].rgbtBlue = image[i][j].rgbtGreen = image[i][j].rgbtRed = avg; + } + } + return; +} + +// Reflect image horizontally +void reflect(int height, int width, RGBTRIPLE image[height][width]) +{ + RGBTRIPLE tmp[height][width]; + + for (int i = 0; i < height; i++) + { + for (int j = 0; j < width; j++) + { + tmp[i][j] = image[i][width - j - 1]; + } + } + + for (int i = 0; i < height; i++) + { + for (int j = 0; j < width; j++) + { + image[i][j] = tmp[i][j]; + } + } + return; +} + +// Blur image +void blur(int height, int width, RGBTRIPLE image[height][width]) +{ + RGBTRIPLE copy[height][width]; + + for (int i = 0; i < height; i++) + { + for (int j = 0; j < width; j++) + { + copy[i][j] = image[i][j]; + } + } + + for (int i = 0; i < height; i++) + { + for (int j = 0; j < width; j++) + { + int sumRed = 0, sumGreen = 0, sumBlue = 0, count = 0; + + for (int k = (i - 1); k <= (i + 1); k++) + { + for (int l = (j - 1); l <= (j + 1); l++) + { + if ((k >= 0 && k <= (height - 1)) && (l >= 0 && l <= (width - 1))) + { + sumRed += copy[k][l].rgbtRed; + sumGreen += copy[k][l].rgbtGreen; + sumBlue += copy[k][l].rgbtBlue; + count++; + } + } + } + image[i][j].rgbtRed = round(sumRed / (float) count); + image[i][j].rgbtGreen = round(sumGreen / (float) count); + image[i][j].rgbtBlue = round(sumBlue / (float) count); + } + } + return; +} + +// Detect edges +void edges(int height, int width, RGBTRIPLE image[height][width]) +{ + 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}}; + + RGBTRIPLE copy[height][width]; + + for (int i = 0; i < height; i++) + { + for (int j = 0; j < width; j++) + { + copy[i][j] = image[i][j]; + } + } + + for (int i = 0; i < height; i++) + { + for (int j = 0; j < width; j++) + { + int sumRedGx = 0, sumGreenGx = 0, sumBlueGx = 0, sumRedGy = 0, sumGreenGy = 0, + sumBlueGy = 0; + + for (int k = (i - 1); k <= (i + 1); k++) + { + for (int l = (j - 1); l <= (j + 1); l++) + { + if ((k >= 0 && k <= (height - 1)) && (l >= 0 && l <= (width - 1))) + { + sumRedGx += copy[k][l].rgbtRed * Gx[i - k + 1][j - l + 1]; + sumGreenGx += copy[k][l].rgbtGreen * Gx[i - k + 1][j - l + 1]; + sumBlueGx += copy[k][l].rgbtBlue * Gx[i - k + 1][j - l + 1]; + sumRedGy += copy[k][l].rgbtRed * Gy[i - k + 1][j - l + 1]; + sumGreenGy += copy[k][l].rgbtGreen * Gy[i - k + 1][j - l + 1]; + sumBlueGy += copy[k][l].rgbtBlue * Gy[i - k + 1][j - l + 1]; + } + } + } + image[i][j].rgbtRed = fmin(round(sqrt(pow(sumRedGx, 2) + pow(sumRedGy, 2))), 255); + image[i][j].rgbtGreen = fmin(round(sqrt(pow(sumGreenGx, 2) + pow(sumGreenGy, 2))), 255); + image[i][j].rgbtBlue = fmin(round(sqrt(pow(sumBlueGx, 2) + pow(sumBlueGy, 2))), 255); + } + } + return; +}