So far this is what I've got:
What I'm trying to do is read in a PPM, store it in an array (done), then prompt the user to enter a threshold. Then detect the edges in an image and output to a new internal array image where pixels that are part of an edgeare white, other pixels are black.
I've been given this formula:
grad = abs(im(x+1, y) - im(x-1, y)) + abs(im(x, y+1) - im(x, y-1))
and am told to compare it to a threshold then sum grad over the colour channels. Any pointers would be welcome. Thanks.
Code:#include <stdio.h> #include <stdlib.h> #include <string.h> #define maxheight 1080 #define maxwidth 1920 #define RGB_COMPONENT_COLOUR 255 #define pgmtype "P2" #define ppmtype "P3" typedef struct { int red, green, blue; } PPMPixel; typedef struct { int x, y; //PPMPixel *data; } PPMImage; typedef struct { int rgb_comp_colour; char filetype[3]; int height; int width; } PPMHead; PPMHead head[3]; PPMPixel r; PPMPixel data; //Defines pointer to PPMPixel PPMPixel **EdgeArray; void edge_detection() { int i, j; FILE *fed; char fnameed[100]; printf("\tEnter first file's name: \n"); scanf("%s", fnameed); fseek(stdin,0,SEEK_END); fed = fopen(fnameed, "r"); if (fed == NULL) { printf("\tError while opening the file\n"); } else { printf("\tWriting in %s\n", fnameed); } fscanf(fed, "%s %d %d %d", head[3].filetype, &head[3].width, &head[3].height, &head[3].rgb_comp_colour); printf("%s %d %d %d", head[3].filetype, head[3].width, head[3].height, head[3].rgb_comp_colour); EdgeArray = (PPMPixel **)malloc(head[3].height*sizeof(PPMPixel*)); //Points to malloc if((EdgeArray == NULL)) { printf("\tError allocating memory to the array\n"); } else { printf("\tMemory allocated to the PPM array sucessfully\n"); } for (i=0;i<head[3].height;i++) { EdgeArray[i] = (PPMPixel *)malloc(head[3].width*sizeof(PPMPixel)); } //Initialising each element for (j=0;j<head[3].height;j++) { for (i=0;i<head[3].width;i++) { fscanf(fed, "%d %d %d ", &r.red, &r.green, &r.blue); PPMPixel* data = &EdgeArray[j][i]; data->red = r.red; data->green = r.green; data->blue = r.blue; } } }