diff --git a/C/Image-processing-main/NEW_PROJECT.c b/C/Image-processing-main/NEW_PROJECT.c new file mode 100644 index 0000000..630682e --- /dev/null +++ b/C/Image-processing-main/NEW_PROJECT.c @@ -0,0 +1,754 @@ +// MADE BY - VINAYAK CHACHRA +// ROLLNO. - 191210061 + + +#include +#include +#include +#define PI 3.14159265 +#define WHITE 255 +#define BLACK 0 +#define THRESHOLD 120 +#define MAX_PIXEL 255 + +void imageBlur(); +void writeImage(const char *imgName, + unsigned char *header, + unsigned char *colorTable, + unsigned char *buf, + int bitDepth, + int imgSize); +void getImageDetail(height,width,maximum); +void imageSepia(); +void grayToBinary() ; +void colorToGray(); +void ChangeDetection(); +void ImageMorphing(); +void meanGray(sum); + +int main() +{ int choice ; + + const char newimgName[]="images/cameraman_copy.bmp"; + + FILE *origianl_file = fopen("images/cameraman.bmp","rb"); // OPEN A FILE FOR READ OPERATION + if(origianl_file == NULL) + { + printf("Unable to open file\n"); + } + unsigned char header[54]; // THE BITMAP HAS 54 BYTES IMAGE HEADER + unsigned char colorTable[1024]; // AND 1024BYTER COLOR TABLE + for(int i =0;i<54;i++) + { + header[i] = fgetc(origianl_file); //COPYING THE INFO ABOUT IMAGE TO OUR HEADER FILE + } + int width = *(int *)&header[18]; // FIRSTLY IT IS TAKING ADDRESS OF WIDTH TYPECATING IT TO INTEGER AND THEN POINTING TO THE VALUE AT THAT ADDRESS + int height = *(int *)&header[22]; //FIRSTLY IT IS TAKING ADDRESS OF HEIGHT TYPECATING IT TO INTEGER AND THEN POINTING TO THE VALUE AT THAT ADDRESS + int bitDepth = *(int *)&header[28];// FIRSTLY IT IS TAKING ADDRESS OF BITDEPTH TYPECATING IT TO INTEGER AND THEN POINTING TO THE VALUE AT THAT ADDRESS + int imgSize = height * width; + + + if(bitDepth<=8) + { + fread(colorTable,sizeof(unsigned char), 1024,origianl_file); // READING VALUE FROM ORIGINAL_FILE AND COPYING IT TO COLOR TABLE + } + + unsigned char buf[width][height]; + fread(buf,sizeof(unsigned char),(height*width), origianl_file);// READING VALUE FROM ORIGINAL_FILE AND COPYING IT TO BUFF + + do +{ printf("TO COPY THE IMAGE PRESS 1)\n"); + printf("TO REFLECT THE IMAGE PRESS 2)\n"); + printf("TO ROTATE THE IMAGE PRESS 3)\n"); + printf("TO ADD NEGATIVE FILTER TO THE IMAGE PRESS 4)\n"); + printf("TO CROP THE IMAGE PRESS 5)\n"); + printf("TO SHRINK THE IMAGE PRESS 6)\n"); + printf("TO INLARGE THE IMAGE PRESS 7)\n"); + printf("TO ADD THE IMAGE PRESS 8)\n"); + printf("TO SUBTRACT THE IMAGE PRESS 9)\n"); + printf("TO TRANSLATE THE IMAGE PRESS 10)\n"); + printf("TO CONVERT RGB TO GRAYSCALE IMAGE PRESS 11)\n"); + printf("TO GRAYSCALE IMAGE TO BINARY IMAGE PRESS 12)\n"); + printf("FOR SEPIA FILTER PRESS 13)\n"); + printf("TO BLUR THE IMAGE PRESS 14)\n"); + printf("TO CHANGE THE PIXEL VALUE OF IMAGE PRESS 16)\n"); + printf("TO KNOW THE PIXEL VALUE OF THE IMAGE PRESS 15)\n"); + printf("FOR INFO ABOUT IMAG PRESS 17)\n"); + printf("TO KNOW THE AVERAGE GRAY VALUE OF THE IMAGE PRESS 18)\n"); + printf("TO EXIT THE MENU PRESS 0)\n"); + printf("your choice"); + scanf("%d",&choice); + switch (choice) +{ + case 1: { + writeImage(newimgName,header,colorTable,buf,bitDepth,imgSize); + printf("OPERATION IS SUCCESSFULL!\n"); + } + break; + case 2: { + FILE *duplicate_file =fopen("images/cameraman_reflect2.bmp","wb"); + fwrite(header,sizeof(unsigned char),54,duplicate_file); // IT IS READING VALUE FROM HEADER AND WRITING IT TO DUPLICATE_FILE + fwrite(colorTable,sizeof(unsigned char),1024,duplicate_file); + unsigned char out_buffer[width][height]; + int x1 , y1 ; + for(int x =0;x=0) + { + x1 = x*cos(h*val) + y*sin(h*val) ; + y1 = height -1*x*sin(h*val ) + y*cos(h*val) ; + } + else + if (h>=90 && h<=180) + { + x1 = width + x*cos(h*val) + y*sin(h*val) ; + y1 = height -1*x*sin(h*val ) + y*cos(h*val) ; + } + else + if (h>=180 && h<=270) + { + x1 = x*cos(h*val) + y*sin(h*val)*(-1) ; + y1 = height -1*x*sin(h*val ) + y*cos(h*val)*(-1) + ; + } + out_buffer[x1][y1] = buf[x][y]; } } + fwrite(out_buffer,sizeof(unsigned char),imgSize,duplicate_file); + for(int x =0;xMAX_PIXEL){ r =MAX_PIXEL;} + if(g>MAX_PIXEL){ g = MAX_PIXEL;} + if(b>MAX_PIXEL){ b = MAX_PIXEL;} + putc(b,fOut); + putc(g,fOut); + putc(r,fOut); + } + fclose(fOut); + fclose(fIn); +} +void grayToBinary() +{ + FILE *original_file4 = fopen("images/cameraman.bmp","rb"); + FILE *duplicate_file = fopen("images/cameraman_black_and_white.bmp","wb"); + unsigned char imgHeader[54]; + unsigned char colorTable[1024]; + if(original_file4 == NULL) + { + printf("Unable to open image \n"); + } + for(int i=0;i<54;i++) + { + imgHeader[i] = getc(original_file4); + } + fwrite(imgHeader,sizeof(unsigned char),54,duplicate_file); + int height = *(int*)&imgHeader[22]; + int width = *(int*)&imgHeader[18]; + int bitDepth = *(int *)&imgHeader[28]; + int imgSize = height * width; + if(bitDepth<=8) + { + fread(colorTable, sizeof(unsigned char),1024,original_file4); + fwrite(colorTable,sizeof(unsigned char),1024,duplicate_file); + } + unsigned char buffer[imgSize]; + fread(buffer,sizeof(unsigned char),imgSize,original_file4); + //Black and White converter + for(int i =0;iTHRESHOLD)? WHITE : BLACK; + if (buffer[i]>THRESHOLD) + { + buffer[i] = WHITE ; + } else + buffer[i] = BLACK ; + } + fwrite(buffer,sizeof(unsigned char), imgSize,duplicate_file); + fclose(original_file4); + fclose(duplicate_file); +} +void colorToGray() +{ + FILE *original_file5 = fopen("images/lena_color.bmp","rb"); // OPEN A FILE FOR READ OPERATION + FILE *gray_file = fopen("images/lena_color_gray_copy.bmp","wb"); + unsigned char header[54]; // THE BITMAP HAS 54BYTES IMAGE HEADER + unsigned char colorTable[1024]; // AND 1024BYTER COLOR TABLE + for(int i =0;i<54;i++) + { + header[i] = fgetc(original_file5); //COPYING THE INFO ABOUT IMAGE TO OUR HEADER FILE + + } + int width = *(int *)&header[18]; // FIRSTLY IT IS TAKING ADDRESS OF WIDTH TYPECATING IT TO INTEGER AND THEN POINTING TO THE VALUE AT THAT ADDRESS + int height = *(int *)&header[22]; //FIRSTLY IT IS TAKING ADDRESS OF HEIGHT TYPECATING IT TO INTEGER AND THEN POINTING TO THE VALUE AT THAT ADDRESS + int bitDepth = *(int *)&header[28];// FIRSTLY IT IS TAKING ADDRESS OF BITDEPTH TYPECATING IT TO INTEGER AND THEN POINTING TO THE VALUE AT THAT ADDRESS + fwrite(header,sizeof(unsigned char),54,gray_file); + if(bitDepth<=8) + { + fread(colorTable,sizeof(unsigned char), 1024,original_file5); // READING VALUE FROM ORIGINAL_FILE AND COPYING IT TO COLOR TABLE + fwrite(colorTable,sizeof(unsigned char),1024,gray_file); + } + unsigned char buf1[height * width]; + long int position = ftell(original_file5); + fread(buf1,sizeof(unsigned char),(height*width), original_file5);// READING VALUE FROM ORIGINAL_FILE AND COPYING IT TO BUFF + fseek(original_file5 , position ,SEEK_SET) ; + int imgSize = height * width; + unsigned char buffer[imgSize][3]; + for(int i =0;i max) + { + max = array[i]; + } + + if(array[i] < min) + { + min = array[i]; + } + } + int g ; +for(int i =0;i