Skip to content

Instantly share code, notes, and snippets.

@Cardosaum
Created November 12, 2020 15:23
Show Gist options
  • Select an option

  • Save Cardosaum/3b8b22b251800cccf8f77e203b79253f to your computer and use it in GitHub Desktop.

Select an option

Save Cardosaum/3b8b22b251800cccf8f77e203b79253f to your computer and use it in GitHub Desktop.

Revisions

  1. Cardosaum created this gist Nov 12, 2020.
    146 changes: 146 additions & 0 deletions helpers.c
    Original 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;
    }