Created
November 12, 2020 15:23
-
-
Save Cardosaum/3b8b22b251800cccf8f77e203b79253f to your computer and use it in GitHub Desktop.
Revisions
-
Cardosaum created this gist
Nov 12, 2020 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,146 @@ #include "helpers.h" // Convert image to grayscale void grayscale(int height, int width, RGBTRIPLE image[height][width]) { int mean_color; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { mean_color = (image[i][j].rgbtRed + image[i][j].rgbtGreen + image[i][j].rgbtBlue) / 3; image[i][j].rgbtRed = mean_color; image[i][j].rgbtGreen = mean_color; image[i][j].rgbtBlue = mean_color; } } return; } // Reflect image horizontally void reflect(int height, int width, RGBTRIPLE image[height][width]) { RGBTRIPLE tmp; for (int i = 0; i < height; i++) { for (int j = 0; j < width/2; j++) { tmp = image[i][j]; image[i][j] = image[i][width - j]; image[i][width - j] = tmp; } } return; } // Blur image void blur(int height, int width, RGBTRIPLE image[height][width]) { // sum of red, green and blue for a 3x3 grid int sr; int sg; int sb; int valid_pixels; for (int i = 0; i <= height; i++) { for (int j = 0; j <= width; j++) { // for each pixel, sum red, green and blue of neighbors to. sr = 0; sg = 0; sb = 0; valid_pixels = 0; for (int m = i-1; m <= i+1; m++) { for (int n = j-1; n <= j+1; n++) { if ((m >= height || m <= 0) || (n >= width || n <= 0)) { continue; } sr += image[m][n].rgbtRed; sg += image[m][n].rgbtGreen; sb += image[m][n].rgbtBlue; valid_pixels++; } } image[i][j].rgbtRed = sr/valid_pixels; image[i][j].rgbtGreen = sg/valid_pixels; image[i][j].rgbtBlue = sb/valid_pixels; } } return; } // Detect edges void edges(int height, int width, RGBTRIPLE image[height][width]) { // normalize image first /* grayscale(height, width, image); */ /* blur(height, width, image); */ // sum of red, green and blue for a 3x3 grid int sr; int sg; int sb; int xsr; int xsg; int xsb; int ysr; int ysg; int ysb; int valid_pixels; 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++) { // for each pixel, compute gx and gy sr = 0; sg = 0; sb = 0; xsr = 0; xsg = 0; xsb = 0; ysr = 0; ysg = 0; ysb = 0; valid_pixels = 0; // first: for each pixel, sum red, green and blue of neighbors. for (int m = -1; m <= 1; m++) { for (int n = -1; n <= 1; n++) { if (i+m < 0 || i+m >= height || j+n < 0 || j+n >= width) { continue; } valid_pixels++; xsr += image[i+m][j+n].rgbtRed * gx[m+1][n+1]; xsg += image[i+m][j+n].rgbtGreen * gx[m+1][n+1]; xsb += image[i+m][j+n].rgbtBlue * gx[m+1][n+1]; ysr += image[i+m][j+n].rgbtRed * gy[m+1][n+1]; ysg += image[i+m][j+n].rgbtGreen * gy[m+1][n+1]; ysb += image[i+m][j+n].rgbtBlue * gy[m+1][n+1]; } } // compute the sober value sr = sqrt(pow(xsr, 2)+pow(ysr, 2)); sg = sqrt(pow(xsg, 2)+pow(ysg, 2)); sb = sqrt(pow(xsb, 2)+pow(ysb, 2)); sr = (sr < 250) ? sr : 250; sg = (sg < 250) ? sg : 250; sb = (sb < 250) ? sb : 250; sr = (sr > 0) ? sr : 0; sg = (sg > 0) ? sg : 0; sb = (sb > 0) ? sb : 0; image[i][j].rgbtRed = sr; image[i][j].rgbtGreen = sg; image[i][j].rgbtBlue = sb; } } return; }