OCR project
							
								
								
									
										24
									
								
								Generate-data/generate-data.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,24 @@ | |||||||
|  | from PIL import Image | ||||||
|  | from PIL import ImageFont | ||||||
|  | from PIL import ImageDraw | ||||||
|  | import os | ||||||
|  |  | ||||||
|  | L = ['ACaslonPro-Regular.otf','AdobeArabic-Regular.otf','AdobeDevanagari-Regular.otf', 'AdobeFangsongStd-Regular.otf','AdobeHebrew-Regular.otf', 'AdobeHeitiStd-Regular.otf', 'AdobeKaitiStd-Regular.otf', 'AdobeMyungjoStd-Medium.otf', 'AdobeNaskh-Medium.otf','AGaramondPro-Regular.otf', 'arial.ttf', 'arialbd.ttf', 'bahnschrift.ttf', 'calibri.ttf', 'calibrib.ttf', 'cambria.ttc', 'cambriab.ttf', 'Candara.ttf', 'Candarab.ttf', 'ChaparralPro-Bold.otf', 'ChaparralPro-Regular.otf', 'consola.ttf', 'consolab.ttf', 'CooperBlackStd.otf', 'corbel.ttf', 'corbelb.ttf', 'ebrima.ttf', 'ebrimabd.ttf', 'framdit.ttf', 'Gabriola.ttf', 'georgia.ttf', 'georgiab.ttf', | ||||||
|  | 'himalaya.ttf', 'HoboStd.otf',   | ||||||
|  | 'Nirmala.ttf', 'NirmalaB.ttf','ntailu.ttf', 'ntailub.ttf', 'NuevaStd-Bold.otf', | ||||||
|  | 'pala.ttf', 'palab.ttf', 'phagspa.ttf', 'phagspab.ttf', | ||||||
|  | 'tahoma.ttf', 'tahomabd.ttf', 'taile.ttf', 'taileb.ttf', 'times.ttf', 'timesbd.ttf', 'trebuc.ttf', 'trebucbd.ttf', 'verdana.ttf', 'verdanab.ttf'] | ||||||
|  |  | ||||||
|  | letter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,'" | ||||||
|  | os.chdir (os.path.dirname(os.path.dirname(__file__)) + '/src/Dataset') | ||||||
|  |  | ||||||
|  | lon_font = len(L) | ||||||
|  | lon_char = len(letter) | ||||||
|  |  | ||||||
|  | for j in range(lon_char): | ||||||
|  |     for i in range(lon_font): | ||||||
|  |         font = ImageFont.truetype(L[i], 24) | ||||||
|  |         img = Image.new('RGB', (32, 32), color = 'white') | ||||||
|  |         draw = ImageDraw.Draw(img) | ||||||
|  |         draw.text((0, 0),letter[j],(0,0,0),font=font) | ||||||
|  |         img.save('image-' + str(j) + "-" + str(i + 1) + '.bmp', 'bmp') | ||||||
							
								
								
									
										166
									
								
								ImageTreatment/Filter/cleanerimage.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,166 @@ | |||||||
|  | #include "cleanerimage.h" | ||||||
|  |  | ||||||
|  | #include "../display.h" | ||||||
|  |  | ||||||
|  | void grayscale(SDL_Surface *img) | ||||||
|  | { | ||||||
|  |     Uint32 pixel; | ||||||
|  |     Uint8 r, g, b; | ||||||
|  |     int w = img->w; | ||||||
|  |     int h = img->h; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < w; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = 0; j < h; j++) | ||||||
|  |         { | ||||||
|  |             pixel = getpixel(img, i, j); | ||||||
|  |             SDL_GetRGB(pixel, img->format, &r, &g, &b); | ||||||
|  |             Uint8 results = 0.3 * r + 0.59 * g + 0.11 * b; | ||||||
|  |             pixel = SDL_MapRGB(img->format, results, results, results); | ||||||
|  |             putpixel(img, i, j, pixel); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void binerize(SDL_Surface *img) | ||||||
|  | { | ||||||
|  |     Uint32 pixel; | ||||||
|  |     Uint8 r, g, b; | ||||||
|  |     int w = img->w; | ||||||
|  |     int h = img->h; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < w; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = 0; j < h; j++) | ||||||
|  |         { | ||||||
|  |             pixel = getpixel(img, i, j); | ||||||
|  |             SDL_GetRGB(pixel, img->format, &r, &g, &b); | ||||||
|  |             Uint32 average = (r + b + g) / 3; | ||||||
|  |  | ||||||
|  |             if (average > 150) /*we can make an average here*/ | ||||||
|  |             { | ||||||
|  |                 r = 255; | ||||||
|  |                 g = 255; | ||||||
|  |                 b = 255; | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 r = 0; | ||||||
|  |                 g = 0; | ||||||
|  |                 b = 0; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             pixel = SDL_MapRGB(img->format, r, g, b); | ||||||
|  |             putpixel(img, i, j, pixel); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | int IsValid(int x, int y, int w, int h) | ||||||
|  | { | ||||||
|  |     return x >= 0 && x < w && y >= 0 && y < h; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | SDL_Surface *Convolute(SDL_Surface *img, float mask[3][3]) | ||||||
|  | { | ||||||
|  |     int offset = 3 / 2; | ||||||
|  |     Uint8 r, g, b; | ||||||
|  |     Uint32 pixel = 0; | ||||||
|  |  | ||||||
|  |     SDL_Surface *copy = CreateWhiteSurface(img->w, img->h, img); | ||||||
|  |     for (int y = 0; y < img->h; ++y) | ||||||
|  |     { | ||||||
|  |         for (int x = 0; x < img->w; ++x) | ||||||
|  |         { | ||||||
|  |             float red = 0; | ||||||
|  |             float green = 0; | ||||||
|  |             float blue = 0; | ||||||
|  |  | ||||||
|  |             for (int dy = -offset; dy <= offset; ++dy) | ||||||
|  |             { | ||||||
|  |                 for (int dx = -offset; dx <= offset; ++dx) | ||||||
|  |                 { | ||||||
|  |                     if (IsValid(x + dx, y + dy, img->w, img->h)) | ||||||
|  |                     { | ||||||
|  |                         pixel = getpixel(img, x + dx, y + dy); | ||||||
|  |                         float coefficient = mask[dy + offset][dx + offset]; | ||||||
|  |                         SDL_GetRGB(pixel, img->format, &r, &g, &b); | ||||||
|  |                         red += r * coefficient; | ||||||
|  |                         green += g * coefficient; | ||||||
|  |                         blue += b * coefficient; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             pixel = SDL_MapRGB(img->format, Restrict256(red), | ||||||
|  |                                Restrict256(green), Restrict256(blue)); | ||||||
|  |             putpixel(copy, x, y, pixel); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return copy; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int Restrict256(int n) | ||||||
|  | { | ||||||
|  |     if (n < 0) | ||||||
|  |         return 0; | ||||||
|  |     if (n > 255) | ||||||
|  |         return 255; | ||||||
|  |     return n; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void ConstrastRenforcement(SDL_Surface *img, int delta) | ||||||
|  | { | ||||||
|  |     double factor = (259 * (delta + 255)) / (255.0 * (259.0 - delta)); | ||||||
|  |     Uint32 pixel; | ||||||
|  |     Uint8 r; | ||||||
|  |     Uint8 g; | ||||||
|  |     Uint8 b; | ||||||
|  |     int w = img->w; | ||||||
|  |     int h = img->h; | ||||||
|  |  | ||||||
|  |     if (delta == 259) | ||||||
|  |     { | ||||||
|  |         delta = 258; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < w; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = 0; j < h; j++) | ||||||
|  |         { | ||||||
|  |             pixel = getpixel(img, i, j); | ||||||
|  |             SDL_GetRGB(pixel, img->format, &r, &g, &b); | ||||||
|  |             r = Restrict256(factor * (r - 128) + 128); | ||||||
|  |             g = Restrict256(factor * (g - 128) + 128); | ||||||
|  |             b = Restrict256(factor * (b - 128) + 128); | ||||||
|  |             pixel = SDL_MapRGB(img->format, r, g, b); | ||||||
|  |             putpixel(img, i, j, pixel); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void noiseReduction(SDL_Surface *img) | ||||||
|  | { | ||||||
|  |     int w = img->w; | ||||||
|  |     int h = img->h; | ||||||
|  |     int pixelmap[9]; | ||||||
|  |  | ||||||
|  |     for (int i = 1; i < h - 1; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = 1; j < w - 1; j++) | ||||||
|  |         { | ||||||
|  |             pixelmap[0] = getpixel(img, j - 1, i - 1); | ||||||
|  |             pixelmap[1] = getpixel(img, j, i - 1); | ||||||
|  |             pixelmap[2] = getpixel(img, j + 1, i - 1); | ||||||
|  |             pixelmap[3] = getpixel(img, j - 1, i); | ||||||
|  |             pixelmap[4] = getpixel(img, j, i); | ||||||
|  |             pixelmap[5] = getpixel(img, j + 1, i); | ||||||
|  |             pixelmap[6] = getpixel(img, j - 1, i + 1); | ||||||
|  |             pixelmap[7] = getpixel(img, j, i + 1); | ||||||
|  |             pixelmap[8] = getpixel(img, j + 1, i + 1); | ||||||
|  |             array_select_sort(pixelmap, 9); | ||||||
|  |             int med = pixelmap[4]; | ||||||
|  |             putpixel(img, j, i, med); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										25
									
								
								ImageTreatment/Filter/cleanerimage.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,25 @@ | |||||||
|  | #ifndef _CLEANERIMAGE_H | ||||||
|  |  | ||||||
|  | #define _CLEANERIMAGE_H | ||||||
|  |  | ||||||
|  | #include <SDL2/SDL.h> | ||||||
|  |  | ||||||
|  | #include "../Tools/tools.h" | ||||||
|  |  | ||||||
|  | void grayscale(SDL_Surface *img); | ||||||
|  |  | ||||||
|  | int IsValid(int x, int y, int w, int h); | ||||||
|  |  | ||||||
|  | void ConstrastRenforcement(SDL_Surface *img, int delta); | ||||||
|  |  | ||||||
|  | int Restrict256(int n); | ||||||
|  |  | ||||||
|  | SDL_Surface *Convolute(SDL_Surface *img, float mask[3][3]); | ||||||
|  |  | ||||||
|  | void noiseReduction(SDL_Surface *img); | ||||||
|  |  | ||||||
|  | void blacknwhite(SDL_Surface *img); | ||||||
|  |  | ||||||
|  | void binerize(SDL_Surface *img); | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										571
									
								
								ImageTreatment/Segmentation/segmentation.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,571 @@ | |||||||
|  | #include "segmentation.h" | ||||||
|  |  | ||||||
|  | /*find if a line contain black pixel*/ | ||||||
|  | /*If contain a black pixel return 0*/ | ||||||
|  | /*x is the height*/ | ||||||
|  | int FindBlackPixel(SDL_Surface *img, int x) | ||||||
|  | { | ||||||
|  |     Uint32 pixel; | ||||||
|  |     int w = img->w; | ||||||
|  |     Uint8 r, g, b; | ||||||
|  |     /*A boolean that memorize if the line contain black pixel ornot*/ | ||||||
|  |     int bool = 1; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < w; i++) | ||||||
|  |     { | ||||||
|  |         pixel = getpixel(img, i, x); | ||||||
|  |         SDL_GetRGB(pixel, img->format, &r, &g, &b); | ||||||
|  |  | ||||||
|  |         if (r == 0) | ||||||
|  |         { | ||||||
|  |             bool = 0; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return bool; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /*Main function which print line on image*/ | ||||||
|  |  | ||||||
|  | void CutLines(SDL_Surface *img, int d) | ||||||
|  | { | ||||||
|  |     Uint32 pixel; | ||||||
|  |     Uint8 r, g, b; | ||||||
|  |     int end_line = 0; | ||||||
|  |     int begin_line = 0; | ||||||
|  |     int w = img->w; | ||||||
|  |     int h = img->h; | ||||||
|  |     d = d % 2; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < h; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = 0; j < w; j++) | ||||||
|  |         { | ||||||
|  |             pixel = getpixel(img, j, i); | ||||||
|  |             SDL_GetRGB(pixel, img->format, &r, &g, &b); | ||||||
|  |  | ||||||
|  |             if (r == 0) /*after binerize is not necessary to test the others | ||||||
|  |                            values*/ | ||||||
|  |             { | ||||||
|  |                 if (FindBlackPixel(img, i - 1)) | ||||||
|  |                 { | ||||||
|  |                     DrawALine(img, i - 1); | ||||||
|  |                     begin_line = i - 1; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 if (FindBlackPixel(img, i + 1)) /*same but for the under line*/ | ||||||
|  |                 { | ||||||
|  |                     DrawALine(img, i + 1); | ||||||
|  |                     end_line = i + 1; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 if (end_line && begin_line) | ||||||
|  |                 { | ||||||
|  |                     if (d) | ||||||
|  |                     { | ||||||
|  |                         CutColumn(img, begin_line, end_line); | ||||||
|  |                     } | ||||||
|  |                     end_line = 0; | ||||||
|  |                     begin_line = 0; | ||||||
|  |                 } | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /*draw a line if necessary*/ | ||||||
|  | void DrawALine(SDL_Surface *img, int x) | ||||||
|  | { | ||||||
|  |     Uint32 pixel; | ||||||
|  |     int w = img->w; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < w; i++) | ||||||
|  |     { | ||||||
|  |         pixel = SDL_MapRGB(img->format, 255, 150, 255); | ||||||
|  |         putpixel(img, i, x, pixel); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /*Main function for mark the column on the image*/ | ||||||
|  | void CutColumn(SDL_Surface *img, int begin_line, int end_line) | ||||||
|  | { | ||||||
|  |     Uint8 r, g, b; | ||||||
|  |     Uint32 pixel; | ||||||
|  |     int w = img->w; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < w; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = begin_line; j < end_line; j++) | ||||||
|  |         { | ||||||
|  |             pixel = getpixel(img, i, j); | ||||||
|  |             SDL_GetRGB(pixel, img->format, &r, &g, &b); | ||||||
|  |  | ||||||
|  |             if (r == 0) /*after binerize is not necessary to test the others | ||||||
|  |                            values */ | ||||||
|  |             { | ||||||
|  |                 if (FindBlackPixelInColumn( | ||||||
|  |                         img, begin_line, end_line, | ||||||
|  |                         i - 1)) /*For the first black pixel we meet, we check if | ||||||
|  |                                    the upper line is full of white and then we | ||||||
|  |                                    draw a line for mark the begin of a new | ||||||
|  |                                    line*/ | ||||||
|  |                 { | ||||||
|  |                     DrawAColumn(img, i - 1, begin_line, end_line); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 if (FindBlackPixelInColumn( | ||||||
|  |                         img, begin_line, end_line, | ||||||
|  |                         i + 1)) /*same but for the under line*/ | ||||||
|  |                 { | ||||||
|  |                     DrawAColumn(img, i + 1, begin_line, end_line); | ||||||
|  |                 } | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /*find if a column contain black pixel*/ | ||||||
|  | /*If contain a black pixel return 0*/ | ||||||
|  | /*start is the value on weight*/ | ||||||
|  | /*begin_line and end_line the value on height*/ | ||||||
|  | int FindBlackPixelInColumn(SDL_Surface *img, int begin_line, int end_line, | ||||||
|  |                            int start) | ||||||
|  | { | ||||||
|  |     Uint32 pixel; | ||||||
|  |     Uint8 r, g, b; | ||||||
|  |     int bool = | ||||||
|  |         1; /*A boolean that memorize if the line contain black pixel or not*/ | ||||||
|  |  | ||||||
|  |     for (int i = begin_line; i < end_line; i++) | ||||||
|  |     { | ||||||
|  |         pixel = getpixel(img, start, i); | ||||||
|  |         SDL_GetRGB(pixel, img->format, &r, &g, &b); | ||||||
|  |  | ||||||
|  |         if (r == 0) | ||||||
|  |         { | ||||||
|  |             bool = 0; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return bool; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /*Draw a column between two lines and characters*/ | ||||||
|  | void DrawAColumn(SDL_Surface *img, int y, int x, int end_line) | ||||||
|  | { | ||||||
|  |     Uint32 pixel; | ||||||
|  |  | ||||||
|  |     for (int i = x; i < end_line; i++) | ||||||
|  |     { | ||||||
|  |         pixel = SDL_MapRGB(img->format, 1, 100, 100); | ||||||
|  |         putpixel(img, y, i, pixel); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int pixelSpacingHorizontal(SDL_Surface *img) | ||||||
|  | { | ||||||
|  |     Uint32 pixel; | ||||||
|  |     Uint8 r; | ||||||
|  |     Uint8 g; | ||||||
|  |     Uint8 b; | ||||||
|  |     int white = 0; | ||||||
|  |     int black = 0; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < img->h; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = 0; j < img->w; j++) | ||||||
|  |         { | ||||||
|  |             pixel = getpixel(img, j, i); | ||||||
|  |             SDL_GetRGB(pixel, img->format, &r, &g, &b); | ||||||
|  |             if (r == 255 && g == 255 && b == 255) | ||||||
|  |             { | ||||||
|  |                 white++; | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 black++; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     return (white) / (black / 2); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // fonctionne pareil que la version horizontale | ||||||
|  | int pixelSpacingVertical(SDL_Surface *img) | ||||||
|  | { | ||||||
|  |     Uint32 pixel; | ||||||
|  |     Uint8 r; | ||||||
|  |     Uint8 g; | ||||||
|  |     Uint8 b; | ||||||
|  |     int white = 0; | ||||||
|  |     int black = 0; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < img->w; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = 0; j < img->h; j++) | ||||||
|  |         { | ||||||
|  |             pixel = getpixel(img, i, j); | ||||||
|  |             SDL_GetRGB(pixel, img->format, &r, &g, | ||||||
|  |                        &b); // recup les r g b du pixel (i, j) car vertical | ||||||
|  |             if (r == 255 && g == 255 | ||||||
|  |                 && b == 255) // pareil qu'en version horizontal | ||||||
|  |             { | ||||||
|  |                 white++; | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 black++; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     return (white) / (black); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void blockDetection_horizontal(SDL_Surface *img) | ||||||
|  | { | ||||||
|  |     Uint32 pixel; | ||||||
|  |     Uint8 r, g, b; | ||||||
|  |     int hori = pixelSpacingHorizontal(img) * 30; | ||||||
|  |     int countWhite; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < img->h; i++) | ||||||
|  |     { | ||||||
|  |         countWhite = 0; | ||||||
|  |         for (int j = 0; j < img->w; j++) | ||||||
|  |         { | ||||||
|  |             pixel = getpixel(img, j, i); | ||||||
|  |             SDL_GetRGB(pixel, img->format, &r, &g, &b); | ||||||
|  |             if (r == 255 && g == 255 && b == 255) | ||||||
|  |             { | ||||||
|  |                 countWhite++; | ||||||
|  |             } | ||||||
|  |             if (r == 0 && g == 0 && b == 0) | ||||||
|  |             { | ||||||
|  |                 if (countWhite <= hori) | ||||||
|  |                 { | ||||||
|  |                     int k = j - 1; | ||||||
|  |                     while (countWhite > 0) | ||||||
|  |                     { | ||||||
|  |                         pixel = SDL_MapRGB(img->format, 0, 0, 0); | ||||||
|  |                         putpixel(img, k, i, pixel); | ||||||
|  |                         countWhite--; | ||||||
|  |                         k--; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     countWhite = 0; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // remplis les espaces verticaux entre deux pixels. | ||||||
|  | // Fonctionne pareil que la version horizontale | ||||||
|  | void blockDetection_vertical(SDL_Surface *img) | ||||||
|  | { | ||||||
|  |     Uint32 pixel; | ||||||
|  |     Uint8 r; | ||||||
|  |     Uint8 g; | ||||||
|  |     Uint8 b; | ||||||
|  |     int verti = pixelSpacingVertical(img) * 3; | ||||||
|  |     int countBlack; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < img->w; i++) | ||||||
|  |     { | ||||||
|  |         countBlack = 0; | ||||||
|  |         for (int j = 0; j < img->h; j++) | ||||||
|  |         { | ||||||
|  |             pixel = getpixel(img, i, j); | ||||||
|  |             SDL_GetRGB(pixel, img->format, &r, &g, &b); | ||||||
|  |             if (r == 255 && g == 255 && b == 255) | ||||||
|  |             { | ||||||
|  |                 countBlack++; | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 if (countBlack <= verti) | ||||||
|  |                 { | ||||||
|  |                     int k = j - 1; | ||||||
|  |                     while (countBlack > 0) | ||||||
|  |                     { | ||||||
|  |                         pixel = SDL_MapRGB(img->format, 0, 0, 0); | ||||||
|  |                         putpixel(img, i, k, pixel); | ||||||
|  |                         countBlack--; | ||||||
|  |                         k--; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     countBlack = 0; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // dessine les blocs en les noircissant entierement | ||||||
|  | //(fait un ET logique du RLSA horizontal et RLSA vertical) | ||||||
|  | // img c'est l'image qui va contenir des blocs remplis de noir | ||||||
|  | // imgHor a subi bloc detection horizontal | ||||||
|  | // imgver a subi bloc detection vertical | ||||||
|  | void drawBlocksMulti(SDL_Surface *img, SDL_Surface *imgHor, SDL_Surface *imgVer) | ||||||
|  | { | ||||||
|  |     Uint32 pixelHor; | ||||||
|  |     Uint32 pixelVer; | ||||||
|  |     Uint32 pixel; | ||||||
|  |     Uint8 r; | ||||||
|  |     Uint8 g; | ||||||
|  |     Uint8 b; | ||||||
|  |  | ||||||
|  |     for (int i = 1; i + 1 < img->w; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = 1; j + 1 < img->h; j++) | ||||||
|  |         { | ||||||
|  |             pixelHor = getpixel(imgHor, i, j); | ||||||
|  |             SDL_GetRGB(pixelHor, imgHor->format, &r, &g, &b); | ||||||
|  |             if (r == 0 && g == 0 && b == 0) | ||||||
|  |             { | ||||||
|  |                 pixelVer = getpixel(imgVer, i, j); | ||||||
|  |                 SDL_GetRGB(pixelVer, imgVer->format, &r, &g, &b); | ||||||
|  |                 if (r == 0 && g == 0 && b == 0) | ||||||
|  |                 { | ||||||
|  |                     pixel = SDL_MapRGB(img->format, 0, 0, 0); | ||||||
|  |                     putpixel(img, i, j, pixel); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void drawBlocks(SDL_Surface *img, SDL_Surface *imgHor) | ||||||
|  | { | ||||||
|  |     Uint32 pixelHor; | ||||||
|  |     Uint32 pixelLine; | ||||||
|  |     Uint8 r; | ||||||
|  |     Uint8 g; | ||||||
|  |     Uint8 b; | ||||||
|  |     int w; | ||||||
|  |     for (int i = 1; i + 1 < img->w; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = 1; j + 1 < img->h; j++) | ||||||
|  |         { | ||||||
|  |             pixelHor = getpixel(imgHor, i, j); | ||||||
|  |             SDL_GetRGB(pixelHor, imgHor->format, &r, &g, &b); | ||||||
|  |             if (r == 0 && g == 0 && b == 0) | ||||||
|  |             { | ||||||
|  |                 w = img->w; | ||||||
|  |                 for (int k = 0; k < w; k++) | ||||||
|  |                 { | ||||||
|  |                     pixelLine = SDL_MapRGB(img->format, 0, 0, 0); | ||||||
|  |                     putpixel(img, k, j, pixelLine); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void drawBlocksLines(SDL_Surface *img, SDL_Surface *imgRLSA) | ||||||
|  | { | ||||||
|  |     Uint32 pixel; | ||||||
|  |     Uint32 pixelRLSA; | ||||||
|  |     Uint32 pixelUp; | ||||||
|  |     Uint32 pixelDown; | ||||||
|  |     Uint32 pixelLeft; | ||||||
|  |     Uint32 pixelRight; | ||||||
|  |     Uint8 r; | ||||||
|  |     Uint8 g; | ||||||
|  |     Uint8 b; | ||||||
|  |  | ||||||
|  |     for (int i = 1; i + 1 < img->w; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = 1; j + 1 < img->h; j++) | ||||||
|  |         { | ||||||
|  |             pixelRLSA = getpixel(imgRLSA, i, j); | ||||||
|  |             SDL_GetRGB(pixelRLSA, imgRLSA->format, &r, &g, &b); | ||||||
|  |             if (r == 0 && g == 0 && b == 0) // si le pixel est noir, | ||||||
|  |             { | ||||||
|  |                 pixelUp = getpixel(imgRLSA, i, j - 1); | ||||||
|  |                 SDL_GetRGB(pixelUp, imgRLSA->format, &r, &g, &b); | ||||||
|  |                 if (r == 255 && g == 255 && b == 255) // pixel du haut | ||||||
|  |                 { | ||||||
|  |                     pixel = SDL_MapRGB(img->format, 0, 0, 255); | ||||||
|  |                     putpixel(img, i, j - 1, pixel); | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     pixelDown = getpixel(imgRLSA, i, j + 1); | ||||||
|  |                     SDL_GetRGB(pixelDown, imgRLSA->format, &r, &g, &b); | ||||||
|  |                     if (r == 255 && g == 255 && b == 255) // pixel d'en bas | ||||||
|  |                     { | ||||||
|  |                         pixel = SDL_MapRGB(img->format, 0, 0, 255); | ||||||
|  |                         putpixel(img, i, j + 1, pixel); | ||||||
|  |                     } | ||||||
|  |                     else | ||||||
|  |                     { | ||||||
|  |                         pixelLeft = getpixel(imgRLSA, i - 1, j); | ||||||
|  |                         SDL_GetRGB(pixelLeft, imgRLSA->format, &r, &g, &b); | ||||||
|  |                         if (r == 255 && g == 255 && b == 255) // pixel de gauche | ||||||
|  |                         { | ||||||
|  |                             pixel = SDL_MapRGB(img->format, 0, 0, 255); | ||||||
|  |                             putpixel(img, i, j - 1, pixel); | ||||||
|  |                         } | ||||||
|  |                         else | ||||||
|  |                         { | ||||||
|  |                             pixelRight = getpixel(imgRLSA, i + 1, j); | ||||||
|  |                             SDL_GetRGB(pixelRight, imgRLSA->format, &r, &g, &b); | ||||||
|  |                             if (r == 255 && g == 255 | ||||||
|  |                                 && b == 255) // pixel de droite | ||||||
|  |                             { | ||||||
|  |                                 pixel = SDL_MapRGB(img->format, 0, 0, 255); | ||||||
|  |                                 putpixel(img, i, j + 1, pixel); | ||||||
|  |                             } | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /*make an histogramme of the black pixel in column of the image*/ | ||||||
|  | /*histo1 is a pointer on a int array*/ | ||||||
|  | void histo(SDL_Surface *img, int *histo1) | ||||||
|  | { | ||||||
|  |     Uint32 pixel; | ||||||
|  |     Uint8 r, g, b; | ||||||
|  |     int w = img->w; | ||||||
|  |     int h = img->h; | ||||||
|  |  | ||||||
|  |     for (int r = 0; r < w; r++) | ||||||
|  |     { | ||||||
|  |         histo1[r] = 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < w; i++) | ||||||
|  |     { | ||||||
|  |         int s = 0; | ||||||
|  |         for (int j = 0; j < h; j++) | ||||||
|  |         { | ||||||
|  |             pixel = getpixel(img, i, j); | ||||||
|  |             SDL_GetRGB(pixel, img->format, &r, &g, &b); | ||||||
|  |  | ||||||
|  |             if (r == 255) | ||||||
|  |             { | ||||||
|  |                 s++; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         histo1[i] = h - s; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | /*useless actually*/ | ||||||
|  | /*void cutchar(SDL_Surface *img){ | ||||||
|  |   int w; | ||||||
|  |   w = img -> w; | ||||||
|  |   int *histog = malloc(w * sizeof(int)); | ||||||
|  |   int average = average1(img); | ||||||
|  |   printf("%i\n",average); | ||||||
|  |   int s = 0; | ||||||
|  |   int bool1=0; | ||||||
|  |   histo(img, histog); | ||||||
|  |   for (int i = 0; i < img -> w; i++){ | ||||||
|  |     if (s > average){ | ||||||
|  |       printf("histo(%i) = %i",i,histog[i]); | ||||||
|  |       DrawAColumn(img, i-s/2, 0,img->h -1); | ||||||
|  |     } | ||||||
|  |     if (histog[i] != 0){ | ||||||
|  |         if(bool1) | ||||||
|  |         { | ||||||
|  |           bool1 =0; | ||||||
|  |         } | ||||||
|  |       s++; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |       bool1=1; | ||||||
|  |       s =0; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   free(histog); | ||||||
|  | }*/ | ||||||
|  |  | ||||||
|  | /*make the average of all suite of zero in the histogramme*/ | ||||||
|  | int average(SDL_Surface *img) | ||||||
|  | { | ||||||
|  |     int w = img->w; | ||||||
|  |     int *histog = malloc(w * sizeof(int)); | ||||||
|  |     histo(img, histog); | ||||||
|  |     int s = 0; | ||||||
|  |     int sum = 0; | ||||||
|  |     int r = 0; | ||||||
|  |     int bool1 = 1; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < img->w; i++) | ||||||
|  |     { | ||||||
|  |         if (histog[i] == 0) | ||||||
|  |         { | ||||||
|  |             if (bool1) | ||||||
|  |             { | ||||||
|  |                 bool1 = 0; | ||||||
|  |                 r += 1; | ||||||
|  |             } | ||||||
|  |             s++; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             sum += s; | ||||||
|  |             bool1 = 1; | ||||||
|  |             s = 0; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     free(histog); | ||||||
|  |     return sum / r; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /*cut all of the word of a line*/ | ||||||
|  | void cutword(SDL_Surface *img) | ||||||
|  | { | ||||||
|  |     int w = img->w; | ||||||
|  |     int *histog = malloc(w * sizeof(int)); | ||||||
|  |     histo(img, histog); | ||||||
|  |     int bool1 = 1; | ||||||
|  |     int r = average(img); | ||||||
|  |     int s = 0; | ||||||
|  |     int pos = 0; | ||||||
|  |     int i; | ||||||
|  |  | ||||||
|  |     for (i = 0; i < img->w; i++) | ||||||
|  |     { | ||||||
|  |         if (histog[i] == 0) | ||||||
|  |         { | ||||||
|  |             if (bool1) | ||||||
|  |             { | ||||||
|  |                 pos = i; | ||||||
|  |                 bool1 = 0; | ||||||
|  |             } | ||||||
|  |             s++; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             if (s >= r * 1.4) | ||||||
|  |             { | ||||||
|  |                 DrawAColumn(img, pos, 0, img->h); | ||||||
|  |             } | ||||||
|  |             bool1 = 1; | ||||||
|  |             s = 0; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (i == img->w) | ||||||
|  |     { | ||||||
|  |         DrawAColumn(img, pos, 0, img->h); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     free(histog); | ||||||
|  | } | ||||||
							
								
								
									
										53
									
								
								ImageTreatment/Segmentation/segmentation.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,53 @@ | |||||||
|  | #ifndef _SEGMENTATION_H | ||||||
|  |  | ||||||
|  | #define _SEGMENTATION_H | ||||||
|  |  | ||||||
|  | #include <SDL2/SDL.h> | ||||||
|  |  | ||||||
|  | #include "../Tools/tools.h" | ||||||
|  |  | ||||||
|  | void CutLines(SDL_Surface *img, int d); | ||||||
|  |  | ||||||
|  | void cutword(SDL_Surface *img); | ||||||
|  |  | ||||||
|  | int seuil(SDL_Surface *img); | ||||||
|  |  | ||||||
|  | void drawBlocksLines(SDL_Surface *img, SDL_Surface *imgRLSA); | ||||||
|  |  | ||||||
|  | void histo(SDL_Surface *img, int *histo1); | ||||||
|  |  | ||||||
|  | int average1(SDL_Surface *img); | ||||||
|  |  | ||||||
|  | void drawBlocksMulti(SDL_Surface *img, SDL_Surface *imgHor, | ||||||
|  |                      SDL_Surface *imgVer); | ||||||
|  |  | ||||||
|  | void drawBlocks(SDL_Surface *img, SDL_Surface *imgHor); | ||||||
|  |  | ||||||
|  | void cutchar(SDL_Surface *img); | ||||||
|  |  | ||||||
|  | int pixelSpacingHorizontal(SDL_Surface *img); | ||||||
|  |  | ||||||
|  | int pixelSpacingVertical(SDL_Surface *img); | ||||||
|  |  | ||||||
|  | void blockDetection_horizontal(SDL_Surface *img); | ||||||
|  |  | ||||||
|  | int average(SDL_Surface *img); | ||||||
|  |  | ||||||
|  | void blockDetection_vertical(SDL_Surface *img); | ||||||
|  |  | ||||||
|  | void CutColumn(SDL_Surface *img, int begin_line, int end_line); | ||||||
|  |  | ||||||
|  | int FindBlackPixelInColumn(SDL_Surface *img, int begin_line, int end_line, | ||||||
|  |                            int start); | ||||||
|  |  | ||||||
|  | void DrawAColumn(SDL_Surface *img, int y, int x, int end_line); | ||||||
|  |  | ||||||
|  | int FindBlackPixel(SDL_Surface *img, int x); | ||||||
|  |  | ||||||
|  | void DrawInImage(SDL_Surface *img); | ||||||
|  |  | ||||||
|  | void DrawALine(SDL_Surface *img, int x); | ||||||
|  |  | ||||||
|  | void lines(SDL_Surface *img); | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										264
									
								
								ImageTreatment/Tools/tools.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,264 @@ | |||||||
|  | #include "tools.h" | ||||||
|  |  | ||||||
|  | #include <math.h> | ||||||
|  |  | ||||||
|  | Uint8 *pixelref(SDL_Surface *surf, unsigned x, unsigned y) | ||||||
|  | { | ||||||
|  |     int bpp = surf->format->BytesPerPixel; | ||||||
|  |     return (Uint8 *)surf->pixels + y * surf->pitch + x * bpp; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | Uint32 getpixel(SDL_Surface *surface, unsigned x, unsigned y) | ||||||
|  | { | ||||||
|  |     Uint8 *p = pixelref(surface, x, y); | ||||||
|  |     switch (surface->format->BytesPerPixel) | ||||||
|  |     { | ||||||
|  |     case 1: | ||||||
|  |         return *p; | ||||||
|  |     case 2: | ||||||
|  |         return *(Uint16 *)p; | ||||||
|  |     case 3: | ||||||
|  |         if (SDL_BYTEORDER == SDL_BIG_ENDIAN) | ||||||
|  |             return p[0] << 16 | p[1] << 8 | p[2]; | ||||||
|  |         else | ||||||
|  |             return p[0] | p[1] << 8 | p[2] << 16; | ||||||
|  |     case 4: | ||||||
|  |         return *(Uint32 *)p; | ||||||
|  |     } | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel) | ||||||
|  | { | ||||||
|  |     Uint8 *p = pixelref(surface, x, y); | ||||||
|  |  | ||||||
|  |     switch (surface->format->BytesPerPixel) | ||||||
|  |     { | ||||||
|  |     case 1: | ||||||
|  |         *p = pixel; | ||||||
|  |         break; | ||||||
|  |  | ||||||
|  |     case 2: | ||||||
|  |         *(Uint16 *)p = pixel; | ||||||
|  |         break; | ||||||
|  |  | ||||||
|  |     case 3: | ||||||
|  |  | ||||||
|  |         if (SDL_BYTEORDER == SDL_BIG_ENDIAN) | ||||||
|  |         { | ||||||
|  |             p[0] = (pixel >> 16) & 0xff; | ||||||
|  |             p[1] = (pixel >> 8) & 0xff; | ||||||
|  |             p[2] = pixel & 0xff; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             p[0] = pixel & 0xff; | ||||||
|  |             p[1] = (pixel >> 8) & 0xff; | ||||||
|  |             p[2] = (pixel >> 16) & 0xff; | ||||||
|  |         } | ||||||
|  |         break; | ||||||
|  |  | ||||||
|  |     case 4: | ||||||
|  |         *(Uint32 *)p = pixel; | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void pause1() | ||||||
|  | { | ||||||
|  |     int continuer = 1; | ||||||
|  |     SDL_Event event; | ||||||
|  |  | ||||||
|  |     while (continuer) | ||||||
|  |     { | ||||||
|  |         SDL_WaitEvent(&event); | ||||||
|  |         switch (event.type) | ||||||
|  |         { | ||||||
|  |         case SDL_QUIT: | ||||||
|  |             continuer = 0; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void array_swap(int array[], size_t i, size_t j) | ||||||
|  | { | ||||||
|  |     int element1 = array[i]; | ||||||
|  |     int element2 = array[j]; | ||||||
|  |     array[i] = element2; | ||||||
|  |     array[j] = element1; | ||||||
|  | } | ||||||
|  | void array_select_sort(int array[], size_t len) | ||||||
|  | { | ||||||
|  |     size_t i = 0; | ||||||
|  |     size_t j; | ||||||
|  |     int min_index; | ||||||
|  |  | ||||||
|  |     while (i < len) | ||||||
|  |     { | ||||||
|  |         j = i; | ||||||
|  |         min_index = j; | ||||||
|  |         while (j < len) | ||||||
|  |         { | ||||||
|  |             if (array[j] < array[min_index]) | ||||||
|  |             { | ||||||
|  |                 min_index = j; | ||||||
|  |             } | ||||||
|  |             j += 1; | ||||||
|  |         } | ||||||
|  |         array_swap(array, i, min_index); | ||||||
|  |         i++; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | SDL_Surface *copy_image(SDL_Surface *img) | ||||||
|  | { | ||||||
|  |     Uint32 pixel; | ||||||
|  |     SDL_Surface *copy; | ||||||
|  |     copy = SDL_CreateRGBSurface(0, img->w, img->h, img->format->BitsPerPixel, 0, | ||||||
|  |                                 0, 0, 0); | ||||||
|  |     for (int i = 0; i < img->w; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = 0; j < img->h; j++) | ||||||
|  |         { | ||||||
|  |             pixel = getpixel(img, i, j); | ||||||
|  |             putpixel(copy, i, j, pixel); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     return (copy); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | SDL_Surface *resize(SDL_Surface *img, int x, int y) | ||||||
|  | { | ||||||
|  |     Uint32 pixel; | ||||||
|  |     SDL_Surface *new = | ||||||
|  |         SDL_CreateRGBSurface(0, x, y, img->format->BitsPerPixel, 0, 0, 0, 0); | ||||||
|  |     int w = img->w; | ||||||
|  |     int h = img->h; | ||||||
|  |     float ratioX = (float)w / x; | ||||||
|  |     float ratioY = (float)h / y; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < x; ++i) | ||||||
|  |     { | ||||||
|  |         for (int j = 0; j < y; ++j) | ||||||
|  |         { | ||||||
|  |             pixel = getpixel(img, (int)(i * ratioX), (int)(j * ratioY)); | ||||||
|  |             putpixel(new, i, j, pixel); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return new; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | SDL_Surface *CreateWhiteSurface(int x, int y, SDL_Surface *img) | ||||||
|  | { | ||||||
|  |     Uint32 pixel; | ||||||
|  |     SDL_Surface *new = | ||||||
|  |         SDL_CreateRGBSurface(0, x, y, img->format->BitsPerPixel, 0, 0, 0, 0); | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < new->w; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = 0; j < new->h; j++) | ||||||
|  |         { | ||||||
|  |             pixel = SDL_MapRGB(img->format, 255, 255, 255); | ||||||
|  |             putpixel(new, i, j, pixel); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return (new); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /*return a new image with a rotation of theta a apply | ||||||
|  | in the image in paramaters*/ | ||||||
|  | SDL_Surface *rotate(double teta, SDL_Surface *img) | ||||||
|  | { | ||||||
|  |     double radian = (teta * M_PI) / 180.0; | ||||||
|  |     int certerx = round(((img->w + 1) / 2) - 1); | ||||||
|  |     int centery = round(((img->h + 1) / 2) - 1); | ||||||
|  |     int xprime = 0; | ||||||
|  |     int yprime = 0; | ||||||
|  |     int h = img->h; | ||||||
|  |     int w = img->w; | ||||||
|  |     Uint32 pixel = 0; | ||||||
|  |     SDL_Surface *new = CreateWhiteSurface(w, h, img); | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < img->w; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = 0; j < img->h; j++) | ||||||
|  |         { | ||||||
|  |             xprime = round((double)(i - certerx) * cos(radian) | ||||||
|  |                            + (double)(j - centery) * sin(radian)); | ||||||
|  |             yprime = round((double)(j - centery) * cos(radian) | ||||||
|  |                            - (double)(i - certerx) * sin(radian)); | ||||||
|  |  | ||||||
|  |             xprime += certerx; | ||||||
|  |             yprime += centery; | ||||||
|  |  | ||||||
|  |             if (xprime >= 0 && xprime < img->w && yprime < img->h | ||||||
|  |                 && yprime >= 0) | ||||||
|  |             { | ||||||
|  |                 pixel = getpixel(img, i, j); | ||||||
|  |                 putpixel(new, xprime, yprime, pixel); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return new; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /*apply hough transformy and return the angle detected*/ | ||||||
|  | double houghtrasformy(SDL_Surface *img) | ||||||
|  | { | ||||||
|  |     double maxrow = sqrt((img->w * img->w) + (img->h * img->h)); | ||||||
|  |     int maxteta = 180; | ||||||
|  |     Uint8 r, g, b; | ||||||
|  |     int *tab = calloc((size_t)(maxrow * 181), sizeof(int)); | ||||||
|  |     Uint32 pixel = 0; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < img->w; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = 0; j < img->h; j++) | ||||||
|  |         { | ||||||
|  |             pixel = getpixel(img, i, j); | ||||||
|  |             SDL_GetRGB(pixel, img->format, &r, &g, &b); | ||||||
|  |  | ||||||
|  |             if (r == 0 && g == 0 && b == 0) | ||||||
|  |             { | ||||||
|  |                 int x = i - (img->w / 2); | ||||||
|  |                 int y = j - (img->h / 2); | ||||||
|  |  | ||||||
|  |                 for (int teta_i = 0; teta_i < maxteta; teta_i++) | ||||||
|  |                 { | ||||||
|  |                     double teta = ((double)teta_i / 180.0) * M_PI; | ||||||
|  |                     double row = x * cos(teta) + y * sin(teta); | ||||||
|  |                     size_t i_rho = 0.5 + (row / maxrow + 0.5) * (maxrow + 1); | ||||||
|  |                     tab[teta_i + maxteta * i_rho] += 1; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     double resulte = maxhough(tab, maxrow); | ||||||
|  |     free(tab); | ||||||
|  |     return resulte; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | double maxhough(int *tab, size_t maxrow) | ||||||
|  | { | ||||||
|  |     double ThetaR; | ||||||
|  |     int max = 0; | ||||||
|  |     size_t maxteta = 180; | ||||||
|  |  | ||||||
|  |     for (size_t i = 0; i < maxrow; ++i) | ||||||
|  |     { | ||||||
|  |         for (size_t j = 0; j < maxteta; ++j) | ||||||
|  |         { | ||||||
|  |             if (tab[j + i * maxteta] > max) | ||||||
|  |             { | ||||||
|  |                 max = tab[j + i * maxteta]; | ||||||
|  |                 ThetaR = j; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return ThetaR; | ||||||
|  | } | ||||||
							
								
								
									
										35
									
								
								ImageTreatment/Tools/tools.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,35 @@ | |||||||
|  | #ifndef TOOLS_H_ | ||||||
|  | #define TOOLS_H_ | ||||||
|  |  | ||||||
|  | #include <SDL2/SDL.h> | ||||||
|  | #include <err.h> | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  |  | ||||||
|  | void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel); | ||||||
|  |  | ||||||
|  | void array_select_sort(int array[], size_t len); | ||||||
|  |  | ||||||
|  | void array_swap(int array[], size_t i, size_t j); | ||||||
|  | void pause1(); | ||||||
|  |  | ||||||
|  | SDL_Surface *CreateWhiteSurface(int x, int y, SDL_Surface *img); | ||||||
|  |  | ||||||
|  | int FindBlackPixelv2(SDL_Surface *img, int x); | ||||||
|  |  | ||||||
|  | SDL_Surface *rotate(double teta, SDL_Surface *img); | ||||||
|  |  | ||||||
|  | double houghtrasformy(SDL_Surface *img); | ||||||
|  |  | ||||||
|  | double maxhough(int *tab, size_t maxrow); | ||||||
|  |  | ||||||
|  | SDL_Surface *copy_image(SDL_Surface *img); | ||||||
|  |  | ||||||
|  | SDL_Surface *resize(SDL_Surface *img, int x, int y); | ||||||
|  |  | ||||||
|  | Uint32 getpixel(SDL_Surface *surface, unsigned x, unsigned y); | ||||||
|  |  | ||||||
|  | Uint8 *pixelref(SDL_Surface *surf, unsigned x, unsigned y); | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										44
									
								
								ImageTreatment/display.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,44 @@ | |||||||
|  | #include "display.h" | ||||||
|  |  | ||||||
|  | void wait_for_keypressed() | ||||||
|  | { | ||||||
|  |     SDL_Event event; | ||||||
|  |  | ||||||
|  |     do | ||||||
|  |     { | ||||||
|  |         SDL_PollEvent(&event); | ||||||
|  |     } while (event.type != SDL_KEYDOWN); | ||||||
|  |  | ||||||
|  |     do | ||||||
|  |     { | ||||||
|  |         SDL_PollEvent(&event); | ||||||
|  |     } while (event.type != SDL_KEYUP); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | SDL_Window *display_img(SDL_Surface *image) | ||||||
|  | { | ||||||
|  |     if (SDL_VideoInit(NULL) < 0) // Initialize SDL | ||||||
|  |     { | ||||||
|  |         printf("Error of initializing SDL : %s", SDL_GetError()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Create window | ||||||
|  |     SDL_Window *fenetre; | ||||||
|  |  | ||||||
|  |     int w = image->w; // width of the bmp | ||||||
|  |     int h = image->h; // height of the bmp | ||||||
|  |  | ||||||
|  |     fenetre = | ||||||
|  |         SDL_CreateWindow("OCR", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, | ||||||
|  |                          w, h, SDL_WINDOW_RESIZABLE); | ||||||
|  |  | ||||||
|  |     if (fenetre == NULL) // if problem return error | ||||||
|  |     { | ||||||
|  |         printf("Error of creating window : %s", SDL_GetError()); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     SDL_BlitSurface(image, NULL, SDL_GetWindowSurface(fenetre), 0); | ||||||
|  |     SDL_UpdateWindowSurface(fenetre); | ||||||
|  |  | ||||||
|  |     return fenetre; | ||||||
|  | } | ||||||
							
								
								
									
										4
									
								
								ImageTreatment/display.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,4 @@ | |||||||
|  | #include <SDL2/SDL.h> | ||||||
|  |  | ||||||
|  | SDL_Window *display_img(SDL_Surface *image); | ||||||
|  | void wait_for_keypressed(); | ||||||
							
								
								
									
										159
									
								
								ImageTreatment/extraction/extractchar.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,159 @@ | |||||||
|  | #include "extractchar.h" | ||||||
|  |  | ||||||
|  | #include <string.h> | ||||||
|  |  | ||||||
|  | #include "../display.h" | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | Return the number of word in the current image | ||||||
|  | */ | ||||||
|  | int countwc(SDL_Surface *img) | ||||||
|  | { | ||||||
|  |     int w = img->w; | ||||||
|  |     Uint32 pixel = 0; | ||||||
|  |     Uint8 r, g, b; | ||||||
|  |     int count = 0; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < w; i++) | ||||||
|  |     { | ||||||
|  |         pixel = getpixel(img, i, 1); | ||||||
|  |         SDL_GetRGB(pixel, img->format, &r, &g, &b); | ||||||
|  |         if ((r == 1 && g == 100 && b == 100)) | ||||||
|  |         { | ||||||
|  |             count++; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return count; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | Return an array of the position of words in the current image | ||||||
|  | */ | ||||||
|  | void ReturnPoswc(SDL_Surface *img, int *tab) | ||||||
|  | { | ||||||
|  |     int w = img->w; | ||||||
|  |     Uint32 pixel = 0; | ||||||
|  |     Uint8 r, g, b; | ||||||
|  |     int count = 0; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < w; i++) | ||||||
|  |     { | ||||||
|  |         pixel = getpixel(img, i, 1); | ||||||
|  |         SDL_GetRGB(pixel, img->format, &r, &g, &b); | ||||||
|  |         if ((r == 1 && g == 100 && b == 100)) | ||||||
|  |         { | ||||||
|  |             tab[count] = i; | ||||||
|  |             count++; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | Create a new surface and extract the word for charactere segmentation | ||||||
|  | */ | ||||||
|  | void extractword(SDL_Surface *img, int x, int y, Neural_Network *network, | ||||||
|  |                  char *str) | ||||||
|  | { | ||||||
|  |     SDL_Surface *new = CreateWhiteSurface(y - x + 1, img->h, img); | ||||||
|  |     Uint32 pixel = 0; | ||||||
|  |  | ||||||
|  |     for (int i = x + 1; i < y; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = 0; j < img->h; j++) | ||||||
|  |         { | ||||||
|  |             pixel = getpixel(img, i, j); | ||||||
|  |             putpixel(new, i - x, j, pixel); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     SDL_SaveBMP(new, "final12.bmp"); | ||||||
|  |     __extractchar(new, network, str); | ||||||
|  |     SDL_FreeSurface(new); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | Create a new surface and extract the caracters for neural network | ||||||
|  | */ | ||||||
|  | void __extractword(SDL_Surface *img, Neural_Network *network, char *str) | ||||||
|  | { | ||||||
|  |     SDL_Surface *loadedImage = resize(img, 1218, 41); | ||||||
|  |     cutword(loadedImage); | ||||||
|  |     int count = countwc(loadedImage); | ||||||
|  |     int *tab = malloc(sizeof(int) * count); | ||||||
|  |     ReturnPoswc(loadedImage, tab); | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < count - 1; i += 1) | ||||||
|  |     { | ||||||
|  |         extractword(loadedImage, tab[i], tab[i + 1], network, str); | ||||||
|  |         char a[] = " "; | ||||||
|  |         strcat(str, a); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     SDL_FreeSurface(loadedImage); | ||||||
|  |     free(tab); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int fullofwhite(SDL_Surface *img) | ||||||
|  | { | ||||||
|  |     Uint32 pixel = 0; | ||||||
|  |     Uint8 r, g, b; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < img->h; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = 0; j < img->w; j++) | ||||||
|  |         { | ||||||
|  |             pixel = getpixel(img, j, i); | ||||||
|  |             SDL_GetRGB(pixel, img->format, &r, &g, &b); | ||||||
|  |             if (r == 0 && g == 0 && b == 0) | ||||||
|  |             { | ||||||
|  |                 return 1; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void extractchar(SDL_Surface *img, int x, int y, Neural_Network *network, | ||||||
|  |                  char *str) | ||||||
|  | { | ||||||
|  |     SDL_Surface *new = CreateWhiteSurface(y - x + 1, img->h, img); | ||||||
|  |     Uint32 pixel = 0; | ||||||
|  |  | ||||||
|  |     for (int i = x + 1; i < y; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = 0; j < img->h; j++) | ||||||
|  |         { | ||||||
|  |             pixel = getpixel(img, i, j); | ||||||
|  |             putpixel(new, i - x, j, pixel); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     if (fullofwhite(new)) | ||||||
|  |     { | ||||||
|  |         double *letter = segmentationtomatrix(new, 20); | ||||||
|  |         ForwardPass(letter, network); | ||||||
|  |         free(letter); | ||||||
|  |         char a[2]; | ||||||
|  |         a[0] = indiceToChar(network->output); | ||||||
|  |         a[1] = '\0'; | ||||||
|  |         strcat(str, a); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void __extractchar(SDL_Surface *img, Neural_Network *network, char *str) | ||||||
|  | { | ||||||
|  |     SDL_Surface *loadedImage = copy_image(img); | ||||||
|  |     CutColumn(loadedImage, 0, img->h); | ||||||
|  |     int count = countwc(loadedImage); | ||||||
|  |     int *tab = malloc(sizeof(int) * count); | ||||||
|  |     ReturnPoswc(loadedImage, tab); | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < count - 1; i += 1) | ||||||
|  |     { | ||||||
|  |         extractchar(loadedImage, tab[i], tab[i + 1], network, str); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     SDL_FreeSurface(loadedImage); | ||||||
|  |     free(tab); | ||||||
|  | } | ||||||
							
								
								
									
										18
									
								
								ImageTreatment/extraction/extractchar.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,18 @@ | |||||||
|  | #ifndef _EXTRACTIONCHAR_H | ||||||
|  | #define _EXTRACTIONCHAR_H | ||||||
|  |  | ||||||
|  | #include "../../NeuralNetwork/structure.h" | ||||||
|  | #include "../../NeuralNetwork/toolsnetworks.h" | ||||||
|  | #include "../../NeuralNetwork/traitement.h" | ||||||
|  | #include "../Segmentation/segmentation.h" | ||||||
|  |  | ||||||
|  | void extractword(SDL_Surface *img, int x, int y, Neural_Network *network, | ||||||
|  |                  char *str); | ||||||
|  | int countwc(SDL_Surface *img); | ||||||
|  | void ReturnPoswc(SDL_Surface *img, int *tab); | ||||||
|  | void __extractword(SDL_Surface *img, Neural_Network *network, char *str); | ||||||
|  | void __extractchar(SDL_Surface *img, Neural_Network *network, char *str); | ||||||
|  | void extractchar(SDL_Surface *img, int x, int y, Neural_Network *network, | ||||||
|  |                  char *str); | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										142
									
								
								ImageTreatment/extraction/extraction.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,142 @@ | |||||||
|  | #include "extraction.h" | ||||||
|  |  | ||||||
|  | #include <string.h> | ||||||
|  |  | ||||||
|  | #include "../Segmentation/segmentation.h" | ||||||
|  | #include "../display.h" | ||||||
|  | #include "extractchar.h" | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | Count the number of line and paragraph in the current image | ||||||
|  | */ | ||||||
|  | int countlinepar(SDL_Surface *img) | ||||||
|  | { | ||||||
|  |     int h = img->h; | ||||||
|  |     Uint32 pixel = 0; | ||||||
|  |     Uint8 r, g, b; | ||||||
|  |     int count = 0; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < h; i++) | ||||||
|  |     { | ||||||
|  |         pixel = getpixel(img, 1, i); | ||||||
|  |         SDL_GetRGB(pixel, img->format, &r, &g, &b); | ||||||
|  |         if ((r == 0 && g == 0 && b == 255) | ||||||
|  |             || (r == 255 && g == 150 && b == 255)) | ||||||
|  |         { | ||||||
|  |             count++; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return count; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | Fill an array with the position of line and paragraph | ||||||
|  | */ | ||||||
|  | void ReturnPosPar(SDL_Surface *img, int *tab) | ||||||
|  | { | ||||||
|  |     int h = img->h; | ||||||
|  |     Uint32 pixel = 0; | ||||||
|  |     Uint8 r, g, b; | ||||||
|  |     int count = 0; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < h; i++) | ||||||
|  |     { | ||||||
|  |         pixel = getpixel(img, 1, i); | ||||||
|  |         SDL_GetRGB(pixel, img->format, &r, &g, &b); | ||||||
|  |         if ((r == 0 && g == 0 && b == 255) | ||||||
|  |             || (r == 255 && g == 150 && b == 255)) | ||||||
|  |         { | ||||||
|  |             tab[count] = i; | ||||||
|  |             count++; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | Create a new surface and paragraph for line segmentation | ||||||
|  | */ | ||||||
|  | void extractpar(SDL_Surface *img, int x, int y, Neural_Network *network, | ||||||
|  |                 char *str) | ||||||
|  | { | ||||||
|  |     SDL_Surface *new = CreateWhiteSurface(img->w, y - x + 1, img); | ||||||
|  |     Uint32 pixel = 0; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < img->w; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = x + 1; j < y; j++) | ||||||
|  |         { | ||||||
|  |             pixel = getpixel(img, i, j); | ||||||
|  |             putpixel(new, i, j - x, pixel); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     __extractline(new, network, str); | ||||||
|  |     SDL_FreeSurface(new); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void __extractpar(SDL_Surface *img, Neural_Network *network, char *str) | ||||||
|  | { | ||||||
|  |     SDL_Surface *imagev = copy_image(img); | ||||||
|  |     SDL_Surface *imagerlsa = copy_image(img); | ||||||
|  |     SDL_Surface *copy_image1 = copy_image(img); | ||||||
|  |     blockDetection_vertical(imagev); | ||||||
|  |     drawBlocks(imagerlsa, imagev); | ||||||
|  |     drawBlocksLines(copy_image1, imagerlsa); | ||||||
|  |     int count = countlinepar(copy_image1); | ||||||
|  |     int *tab = malloc(sizeof(int) * count); | ||||||
|  |     ReturnPosPar(copy_image1, tab); | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < count - 1; i += 2) | ||||||
|  |     { | ||||||
|  |         extractpar(copy_image1, tab[i], tab[i + 1], network, str); | ||||||
|  |         char a[] = "\n\n\n"; | ||||||
|  |         strcat(str, a); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     SDL_FreeSurface(imagerlsa); | ||||||
|  |     SDL_FreeSurface(imagev); | ||||||
|  |     SDL_FreeSurface(copy_image1); | ||||||
|  |     free(tab); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | Create a new surface and extract the line for word segmentation | ||||||
|  | */ | ||||||
|  | void extractline(SDL_Surface *img, int x, int y, Neural_Network *network, | ||||||
|  |                  char *str) | ||||||
|  | { | ||||||
|  |     SDL_Surface *new = CreateWhiteSurface(img->w, y - x + 1, img); | ||||||
|  |     Uint32 pixel = 0; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < img->w; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = x + 1; j < y; j++) | ||||||
|  |         { | ||||||
|  |             pixel = getpixel(img, i, j); | ||||||
|  |             putpixel(new, i, j - x, pixel); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     __extractword(new, network, str); | ||||||
|  |     SDL_FreeSurface(new); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void __extractline(SDL_Surface *img, Neural_Network *network, char *str) | ||||||
|  | { | ||||||
|  |     SDL_Surface *copy = copy_image(img); | ||||||
|  |     CutLines(copy, 0); | ||||||
|  |     int count = countlinepar(copy); | ||||||
|  |     int *tab = malloc(sizeof(int) * count); | ||||||
|  |     ReturnPosPar(copy, tab); | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < count - 1; i += 2) | ||||||
|  |     { | ||||||
|  |         extractline(copy, tab[i], tab[i + 1], network, str); | ||||||
|  |         char a[] = "\n"; | ||||||
|  |         strcat(str, a); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     SDL_FreeSurface(copy); | ||||||
|  |     free(tab); | ||||||
|  | } | ||||||
							
								
								
									
										16
									
								
								ImageTreatment/extraction/extraction.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,16 @@ | |||||||
|  | #ifndef _EXTRACTION_H | ||||||
|  | #define _EXTRACTION_H | ||||||
|  |  | ||||||
|  | #include "../../NeuralNetwork/structure.h" | ||||||
|  | #include "../Segmentation/segmentation.h" | ||||||
|  |  | ||||||
|  | void extractpar(SDL_Surface *img, int x, int y, Neural_Network *network, | ||||||
|  |                 char *str); | ||||||
|  | int countlinepar(SDL_Surface *img); | ||||||
|  | void ReturnPosPar(SDL_Surface *img, int *tab); | ||||||
|  | void __extractpar(SDL_Surface *img, Neural_Network *network, char *str); | ||||||
|  | void __extractline(SDL_Surface *img, Neural_Network *network, char *str); | ||||||
|  | void extractline(SDL_Surface *img, int x, int y, Neural_Network *network, | ||||||
|  |                  char *str); | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										62
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,62 @@ | |||||||
|  | CC=gcc | ||||||
|  | CPPFLAGS= -MMD `pkg-config --cflags gtk+-3.0` | ||||||
|  | CFLAGS= -Wall -Wextra -std=c99 -g -D_XOPEN_SOURCE=600 | ||||||
|  | LDLIBS= `pkg-config --libs gtk+-3.0` -lSDL2 -lm -rdynamic | ||||||
|  | EXEC= OCR | ||||||
|  |  | ||||||
|  |  | ||||||
|  | all: $(EXEC) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | OCR: main.o segmentation.o cleanerimage.o tools.o display.o extraction.o extractchar.o structure.o training.o toolsnetworks.o traitement.o Load.o | ||||||
|  | 	$(CC) -o OCR main.o segmentation.o cleanerimage.o tools.o display.o extraction.o extractchar.o structure.o training.o toolsnetworks.o Load.o traitement.o $(LDLIBS) | ||||||
|  | 	rm -rf *.o *.d | ||||||
|  |  | ||||||
|  |  | ||||||
|  | main.o: main.c | ||||||
|  | 	$(CC) -o main.o -c main.c $(CFLAGS) $(CPPFLAGS) | ||||||
|  |  | ||||||
|  | segmentation.o: ImageTreatment/Segmentation/segmentation.c | ||||||
|  | 	$(CC) -o segmentation.o -c ImageTreatment/Segmentation/segmentation.c $(CFLAGS) $(CPPFLAGS) | ||||||
|  |  | ||||||
|  | cleanerimage.o: ImageTreatment/Filter/cleanerimage.c | ||||||
|  | 	$(CC) -o cleanerimage.o -c ImageTreatment/Filter/cleanerimage.c $(CFLAGS) $(CPPFLAGS) | ||||||
|  |  | ||||||
|  | tools.o: ImageTreatment/Tools/tools.c | ||||||
|  | 	$(CC) -o tools.o -c ImageTreatment/Tools/tools.c $(CFLAGS) $(CPPFLAGS) -lm | ||||||
|  |  | ||||||
|  | display.o: ImageTreatment/display.c | ||||||
|  | 	$(CC) -o display.o -c ImageTreatment/display.c $(CFLAGS) $(CPPFLAGS) | ||||||
|  |  | ||||||
|  | extraction.o: ImageTreatment/extraction/extraction.c | ||||||
|  | 	$(CC) -o extraction.o -c ImageTreatment/extraction/extraction.c $(CFLAGS) $(CPPFLAGS) | ||||||
|  |  | ||||||
|  | extractchar.o: ImageTreatment/extraction/extractchar.c | ||||||
|  | 	$(CC) -o extractchar.o -c ImageTreatment/extraction/extractchar.c $(CFLAGS) $(CPPFLAGS) | ||||||
|  |  | ||||||
|  | structure.o: NeuralNetwork/structure.c | ||||||
|  | 	$(CC) -o structure.o -c NeuralNetwork/structure.c $(CFLAGS) $(CPPFLAGS) | ||||||
|  |  | ||||||
|  | training.o: NeuralNetwork/training.c | ||||||
|  | 	$(CC) -o training.o -c NeuralNetwork/training.c $(CFLAGS) $(CPPFLAGS) | ||||||
|  |  | ||||||
|  | toolsnetworks.o: NeuralNetwork/toolsnetworks.c | ||||||
|  | 	$(CC) -o toolsnetworks.o -c NeuralNetwork/toolsnetworks.c $(CFLAGS) $(CPPFLAGS) | ||||||
|  |  | ||||||
|  | traitement.o: NeuralNetwork/traitement.c | ||||||
|  | 	$(CC) -o traitement.o -c NeuralNetwork/traitement.c $(CFLAGS) $(CPPFLAGS) | ||||||
|  |  | ||||||
|  | Load.o: NeuralNetwork/Load.c | ||||||
|  | 	$(CC) -o Load.o -c NeuralNetwork/Load.c $(CFLAGS) $(CPPFLAGS) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | Test: main.c | ||||||
|  | 	$(CC) -o main.o -c main.c $(CFLAGS) $(CPPFLAGS) | ||||||
|  | 	 | ||||||
|  |  | ||||||
|  | clean: | ||||||
|  | 	rm -rf *.o *.d OCR | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 	 | ||||||
							
								
								
									
										171
									
								
								NeuralNetwork/Load.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,171 @@ | |||||||
|  | #include "Load.h" | ||||||
|  |  | ||||||
|  | double *resizearray(double *img, int w, int h, int x, int y) | ||||||
|  | { | ||||||
|  |     double *image = (double *)calloc(x * y, sizeof(double)); | ||||||
|  |     float ratioX = (float)w / x; | ||||||
|  |     float ratioY = (float)h / y; | ||||||
|  |     for (int i = 0; i < x; ++i) | ||||||
|  |     { | ||||||
|  |         for (int j = 0; j < y; ++j) | ||||||
|  |         { | ||||||
|  |             image[i * x + j] = | ||||||
|  |                 img[((int)(i * ratioY)) * w + ((int)(j * ratioX))]; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     return image; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int FindBlackPixelrow(double *img, int w, int x) | ||||||
|  | { | ||||||
|  |     int bool = 0; | ||||||
|  |     /*A boolean that memorize if the line contain black pixel or not*/ | ||||||
|  |     double pixel; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < w; i++) | ||||||
|  |     { | ||||||
|  |         pixel = img[x * w + i]; | ||||||
|  |         if (pixel == 1) | ||||||
|  |         { | ||||||
|  |             bool = 1; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     return bool; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int FindBlackPixelcol(double *img, int w, int h, int x) | ||||||
|  | { | ||||||
|  |     int bool = 0; | ||||||
|  |     /*A boolean that memorize if the line contain black pixel or not*/ | ||||||
|  |     double pixel; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < h; i++) | ||||||
|  |     { | ||||||
|  |         pixel = img[i * w + x]; | ||||||
|  |         if (pixel == 1) | ||||||
|  |         { | ||||||
|  |             bool = 1; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     return bool; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void get_binerize_matrix(SDL_Surface *img, double *image) | ||||||
|  | { | ||||||
|  |     /* Variables */ | ||||||
|  |     Uint32 pixel; | ||||||
|  |     Uint8 r; | ||||||
|  |     Uint8 g; | ||||||
|  |     Uint8 b; | ||||||
|  |     int w = img->w; | ||||||
|  |     int h = img->h; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < h; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = 0; j < w; j++) | ||||||
|  |         { | ||||||
|  |             pixel = getpixel(img, j, i); | ||||||
|  |             SDL_GetRGB(pixel, img->format, &r, &g, &b); | ||||||
|  |  | ||||||
|  |             Uint32 average = (r + b + g) / 3; | ||||||
|  |  | ||||||
|  |             if (average > 150) /*we can make an average here*/ | ||||||
|  |                 image[i * w + j] = 0.0; | ||||||
|  |             else | ||||||
|  |                 image[i * w + j] = 1.0; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | double *resizechar(SDL_Surface *img, int size) | ||||||
|  | { | ||||||
|  |     int startcol = 0; | ||||||
|  |     int endcol = 0; | ||||||
|  |     int startrow = 0; | ||||||
|  |     int endrow = 0; | ||||||
|  |  | ||||||
|  |     int img_w = img->w; | ||||||
|  |     int img_h = img->h; | ||||||
|  |  | ||||||
|  |     double *img_array = (double *)malloc(img_h * img_w * sizeof(double)); | ||||||
|  |  | ||||||
|  |     get_binerize_matrix(img, img_array); | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < img_w; i++) | ||||||
|  |     { | ||||||
|  |         if (FindBlackPixelcol(img_array, img_w, img_h, i)) | ||||||
|  |         { | ||||||
|  |             startcol = i; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     for (int i = img_w - 1; i >= 0; i--) | ||||||
|  |     { | ||||||
|  |         if (FindBlackPixelcol(img_array, img_w, img_h, i)) | ||||||
|  |         { | ||||||
|  |             endcol = i + 1; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     for (int i = 0; i < img_h; i++) | ||||||
|  |     { | ||||||
|  |         if (FindBlackPixelrow(img_array, img_w, i)) | ||||||
|  |         { | ||||||
|  |             startrow = i; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     for (int i = img_h - 1; i >= 0; i--) | ||||||
|  |     { | ||||||
|  |         if (FindBlackPixelrow(img_array, img_w, i)) | ||||||
|  |         { | ||||||
|  |             endrow = i + 1; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     double *img_carre; | ||||||
|  |     int img_carre_size; | ||||||
|  |     int lencol = endcol - startcol; | ||||||
|  |     int lenrow = endrow - startrow; | ||||||
|  |  | ||||||
|  |     if (lencol > lenrow) | ||||||
|  |     { | ||||||
|  |         img_carre_size = lencol; | ||||||
|  |         img_carre = (double *)calloc(lencol * lencol, sizeof(double)); | ||||||
|  |         int start = lencol / 2 - lenrow / 2; | ||||||
|  |         for (int k = startrow; k < endrow; k++) | ||||||
|  |         { | ||||||
|  |             for (int z = startcol; z < endcol; z++) | ||||||
|  |             { | ||||||
|  |                 img_carre[(k - startrow + start) * lencol + z - startcol] = | ||||||
|  |                     img_array[k * img_w + z]; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         img_carre_size = lenrow; | ||||||
|  |         img_carre = (double *)calloc(lenrow * lenrow, sizeof(double)); | ||||||
|  |         int start = lenrow / 2 - lencol / 2; | ||||||
|  |         for (int k = startrow; k < endrow; k++) | ||||||
|  |         { | ||||||
|  |             for (int z = startcol; z < endcol; z++) | ||||||
|  |             { | ||||||
|  |                 img_carre[(k - startrow) * lenrow + z - startcol + start] = | ||||||
|  |                     img_array[k * img_w + z]; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     double *image; | ||||||
|  |     image = resizearray(img_carre, img_carre_size, img_carre_size, size, size); | ||||||
|  |  | ||||||
|  |     SDL_FreeSurface(img); | ||||||
|  |     free(img_array); | ||||||
|  |     free(img_carre); | ||||||
|  |  | ||||||
|  |     return image; | ||||||
|  | } | ||||||
							
								
								
									
										21
									
								
								NeuralNetwork/Load.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,21 @@ | |||||||
|  | #ifndef LOAD_H | ||||||
|  | #define LOAD_H | ||||||
|  |  | ||||||
|  | #include <SDL2/SDL.h> | ||||||
|  | #include <err.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  |  | ||||||
|  | #include "../ImageTreatment/Tools/tools.h" | ||||||
|  |  | ||||||
|  | int FindBlackPixelrow(double *img, int w, int x); | ||||||
|  |  | ||||||
|  | int FindBlackPixelcol(double *img, int w, int h, int x); | ||||||
|  |  | ||||||
|  | double *resizechar(SDL_Surface *img, int size); | ||||||
|  |  | ||||||
|  | double *resizearray(double *img, int w, int h, int x, int y); | ||||||
|  |  | ||||||
|  | void get_binerize_matrix(SDL_Surface *img, double *image); | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										135
									
								
								NeuralNetwork/structure.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,135 @@ | |||||||
|  | #include "structure.h" | ||||||
|  |  | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <time.h> | ||||||
|  |  | ||||||
|  | #include "toolsnetworks.h" | ||||||
|  | #include "training.h" | ||||||
|  | #include "traitement.h" | ||||||
|  |  | ||||||
|  | // Definition des structure du reseau de neurone | ||||||
|  |  | ||||||
|  | Neural_Network_Cell Create_Cell(int nb_weight) | ||||||
|  | { | ||||||
|  |     Neural_Network_Cell cell; | ||||||
|  |     cell.nb_weight = nb_weight; | ||||||
|  |     cell.biais = 0; | ||||||
|  |     cell.output = 0; | ||||||
|  |     cell.weights = (double *)malloc(nb_weight * sizeof(double)); | ||||||
|  |     cell.previous_dError = (double *)malloc(nb_weight * sizeof(double)); | ||||||
|  |     return cell; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | Neural_Network_Layer Create_Layer(int nb_cell, int nb_weight) | ||||||
|  | { | ||||||
|  |     Neural_Network_Layer layer; | ||||||
|  |     layer.nb_cells = nb_cell; | ||||||
|  |     layer.cells = | ||||||
|  |         (Neural_Network_Cell *)malloc(nb_cell * sizeof(Neural_Network_Cell)); | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < nb_cell; i++) | ||||||
|  |     { | ||||||
|  |         *(layer.cells + i) = Create_Cell(nb_weight); | ||||||
|  |     } | ||||||
|  |     return layer; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Free_Network(Neural_Network *network) | ||||||
|  | { | ||||||
|  |     for (int i = 0; i < network->nb_layers; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = 0; j < network->layers[i].nb_cells; j++) | ||||||
|  |         { | ||||||
|  |             free(network->layers[i].cells[j].weights); | ||||||
|  |             free(network->layers[i].cells[j].previous_dError); | ||||||
|  |         } | ||||||
|  |         free(network->layers[i].cells); | ||||||
|  |     } | ||||||
|  |     free(network->layers); | ||||||
|  |     free(network); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int getIndiceMax(Neural_Network *network) | ||||||
|  | { | ||||||
|  |     Neural_Network_Layer layer = network->layers[network->nb_layers - 1]; | ||||||
|  |     int i_max = 0; | ||||||
|  |     for (int i = 0; i < layer.nb_cells; i++) | ||||||
|  |     { | ||||||
|  |         if (layer.cells[i].output > layer.cells[i_max].output) | ||||||
|  |             i_max = i; | ||||||
|  |     } | ||||||
|  |     return i_max; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int Save_Network(Neural_Network *network, char *filename) | ||||||
|  | { | ||||||
|  |     FILE *file; | ||||||
|  |     char path[100]; | ||||||
|  |     sprintf(path, "src/SaveNeuralNetwork/%s", filename); | ||||||
|  |     file = fopen(path, "w"); | ||||||
|  |  | ||||||
|  |     if (!file) | ||||||
|  |         return 0; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < network->nb_layers; i++) | ||||||
|  |     { | ||||||
|  |         int nb_c = network->layers[i].nb_cells; | ||||||
|  |  | ||||||
|  |         for (int j = 0; j < nb_c; j++) | ||||||
|  |         { | ||||||
|  |             int nb_w = network->layers[i].cells[j].nb_weight; | ||||||
|  |  | ||||||
|  |             for (int k = 0; k < nb_w; k++) | ||||||
|  |             { | ||||||
|  |                 fprintf(file, "%f\n", network->layers[i].cells[j].weights[k]); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             fprintf(file, "%f\n", network->layers[i].cells[j].biais); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     fclose(file); | ||||||
|  |     return 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int Load_Network(Neural_Network *network, char *filename) | ||||||
|  | { | ||||||
|  |     FILE *file; | ||||||
|  |     char path[100]; | ||||||
|  |     sprintf(path, "src/SaveNeuralNetwork/%s", filename); | ||||||
|  |     file = fopen(path, "r"); | ||||||
|  |  | ||||||
|  |     if (!file) | ||||||
|  |         return 0; | ||||||
|  |  | ||||||
|  |     char *cvalue = calloc(128, sizeof(char)); | ||||||
|  |     double value; | ||||||
|  |     char *ptr; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < network->nb_layers; i++) | ||||||
|  |     { | ||||||
|  |         int nb_c = network->layers[i].nb_cells; | ||||||
|  |  | ||||||
|  |         for (int j = 0; j < nb_c; j++) | ||||||
|  |         { | ||||||
|  |             int nb_w = network->layers[i].cells[j].nb_weight; | ||||||
|  |  | ||||||
|  |             for (int k = 0; k < nb_w; k++) | ||||||
|  |             { | ||||||
|  |                 fgets(cvalue, 128, file); | ||||||
|  |                 value = strtod(cvalue, &ptr); | ||||||
|  |                 network->layers[i].cells[j].weights[k] = value; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             fgets(cvalue, 128, file); | ||||||
|  |             value = strtod(cvalue, &ptr); | ||||||
|  |             network->layers[i].cells[j].biais = value; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     free(cvalue); | ||||||
|  |     return 1; | ||||||
|  | } | ||||||
							
								
								
									
										36
									
								
								NeuralNetwork/structure.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,36 @@ | |||||||
|  | #ifndef STRUCTURE_H | ||||||
|  | #define STRUCTURE_H | ||||||
|  |  | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int nb_weight; | ||||||
|  |     double *weights; | ||||||
|  |     double *previous_dError; | ||||||
|  |     double biais; | ||||||
|  |     double output; | ||||||
|  | } Neural_Network_Cell; | ||||||
|  |  | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int nb_cells; | ||||||
|  |     Neural_Network_Cell *cells; | ||||||
|  | } Neural_Network_Layer; | ||||||
|  |  | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |     int nboutput; | ||||||
|  |     int nb_layers; | ||||||
|  |     Neural_Network_Layer *layers; | ||||||
|  |     double output; | ||||||
|  | } Neural_Network; | ||||||
|  |  | ||||||
|  | Neural_Network_Cell Create_Cell(int nb_weight); | ||||||
|  | Neural_Network_Layer Create_Layer(int nb_cell, int nb_weight); | ||||||
|  |  | ||||||
|  | void Free_Network(Neural_Network *network); | ||||||
|  |  | ||||||
|  | int getIndiceMax(Neural_Network *network); | ||||||
|  | int Save_Network(Neural_Network *network, char *filename); | ||||||
|  | int Load_Network(Neural_Network *network, char *filename); | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										98
									
								
								NeuralNetwork/toolsnetworks.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,98 @@ | |||||||
|  | #include "toolsnetworks.h" | ||||||
|  |  | ||||||
|  | #include <SDL2/SDL_image.h> | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <sys/stat.h> | ||||||
|  | #include <time.h> | ||||||
|  |  | ||||||
|  | #include "Load.h" | ||||||
|  | #include "structure.h" | ||||||
|  | #include "training.h" | ||||||
|  | #include "traitement.h" | ||||||
|  |  | ||||||
|  | // Definition des fonctions de type outils et fonctions mathématiques | ||||||
|  |  | ||||||
|  | float my_rand(void) | ||||||
|  | { | ||||||
|  |     return ((float)(rand() % 10000) / 5000) - 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | double sigmoid(double val) | ||||||
|  | { | ||||||
|  |     return (1.0 / (1.0 + exp(-1.0 * val))); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void softmax(Neural_Network_Layer *layer) | ||||||
|  | { | ||||||
|  |     double min = 0; | ||||||
|  |     for (int i = 0; i < layer->nb_cells; i++) | ||||||
|  |     { | ||||||
|  |         if (layer->cells[i].output < min) | ||||||
|  |             min = layer->cells[i].output; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     double somme = 0; | ||||||
|  |     for (int i = 0; i < layer->nb_cells; i++) | ||||||
|  |     { | ||||||
|  |         layer->cells[i].output -= min; | ||||||
|  |         somme += exp(layer->cells[i].output); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < layer->nb_cells; i++) | ||||||
|  |     { | ||||||
|  |         layer->cells[i].output = (exp(layer->cells[i].output) / somme); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | char indiceToChar(int indice) | ||||||
|  | { | ||||||
|  |     if (indice < 26) | ||||||
|  |         return indice + 97; | ||||||
|  |     else if (indice < 52) | ||||||
|  |         return indice + 39; | ||||||
|  |     else if (indice < 62) | ||||||
|  |         return indice - 4; | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         if (indice == 62) | ||||||
|  |             return 46; | ||||||
|  |         else if (indice == 63) | ||||||
|  |             return 44; | ||||||
|  |         else | ||||||
|  |             return 39; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | double *imagetomatrix(char *str, int size) | ||||||
|  | { | ||||||
|  |     SDL_Surface *loadedImage = 0; | ||||||
|  |     loadedImage = SDL_LoadBMP(str); | ||||||
|  |     double *img = NULL; | ||||||
|  |  | ||||||
|  |     if (!loadedImage) | ||||||
|  |     { | ||||||
|  |         printf("Can't find the bmp file, %s\n", str); | ||||||
|  |         return img; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     img = resizechar(loadedImage, size); | ||||||
|  |     return img; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | double *segmentationtomatrix(SDL_Surface *loadedImage, int size) | ||||||
|  | { | ||||||
|  |     double *img = NULL; | ||||||
|  |  | ||||||
|  |     if (!loadedImage) | ||||||
|  |     { | ||||||
|  |         printf("Can't find the bmp file\n"); | ||||||
|  |         return img; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     img = resizechar(loadedImage, size); | ||||||
|  |  | ||||||
|  |     return img; | ||||||
|  | } | ||||||
							
								
								
									
										19
									
								
								NeuralNetwork/toolsnetworks.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,19 @@ | |||||||
|  | #ifndef TOOLS__NETWORKS_H | ||||||
|  | #define TOOLS__NETWORKS_H | ||||||
|  |  | ||||||
|  | #include <SDL2/SDL.h> | ||||||
|  |  | ||||||
|  | #include "structure.h" | ||||||
|  |  | ||||||
|  | float my_rand(void); | ||||||
|  |  | ||||||
|  | void softmax(Neural_Network_Layer *layer); | ||||||
|  |  | ||||||
|  | char indiceToChar(int indice); | ||||||
|  |  | ||||||
|  | double sigmoid(double val); | ||||||
|  |  | ||||||
|  | double *imagetomatrix(char *str, int size); | ||||||
|  | double *segmentationtomatrix(SDL_Surface *loadedImage, int size); | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										87
									
								
								NeuralNetwork/training.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,87 @@ | |||||||
|  | #include "training.h" | ||||||
|  |  | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <time.h> | ||||||
|  |  | ||||||
|  | #include "structure.h" | ||||||
|  | #include "toolsnetworks.h" | ||||||
|  | #include "traitement.h" | ||||||
|  |  | ||||||
|  | #define NB_OUTPUT 65 | ||||||
|  |  | ||||||
|  | void training(Neural_Network *network, int nb_repetition) | ||||||
|  | { | ||||||
|  |     int nbchar = 65; | ||||||
|  |     int nbimageschar = 53; | ||||||
|  |     int datasetsize = nbchar * nbimageschar; | ||||||
|  |  | ||||||
|  |     // On construit les tableaux input de taille nbrepetition, et on initialise | ||||||
|  |     // en même temps le coût attendu à 0 pour toutres les répétitions (on a | ||||||
|  |     // nbrépétition tableaux de taille 63 initialisés à 0). | ||||||
|  |     double **input = (double **)malloc(datasetsize * sizeof(double *)); | ||||||
|  |     double **cost = (double **)malloc(datasetsize * sizeof(double)); | ||||||
|  |  | ||||||
|  |     char str[100]; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < datasetsize; i++) | ||||||
|  |     { | ||||||
|  |         cost[i] = (double *)calloc(NB_OUTPUT, sizeof(double)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < nbimageschar; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = 0; j < nbchar; j++) | ||||||
|  |         { | ||||||
|  |             sprintf(str, "src/Dataset/image-%d-%d.bmp", j, i + 1); | ||||||
|  |             input[i * nbchar + j] = imagetomatrix(str, 20); | ||||||
|  |             cost[i * nbchar + j][j] = 1; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     double err = 1.0; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < nb_repetition; i++) | ||||||
|  |     { | ||||||
|  |         err = 0; | ||||||
|  |  | ||||||
|  |         for (int j = 0; j < datasetsize; j++) | ||||||
|  |         { | ||||||
|  |             // On fait ensuite appel au ForwardPass sur cette itération <=> on | ||||||
|  |             // voit ce que renvoie notre réseau pour la matrice de pixel | ||||||
|  |             // correspondant à l'image récupérée. | ||||||
|  |             ForwardPass(input[j], network); | ||||||
|  |  | ||||||
|  |             double tmp_err = 0.0; | ||||||
|  |  | ||||||
|  |             for (int k = 0; k < NB_OUTPUT; k++) | ||||||
|  |             { | ||||||
|  |                 tmp_err += (cost[j][k] - network->layers[1].cells[k].output) | ||||||
|  |                     * (cost[j][k] - network->layers[1].cells[k].output); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             tmp_err /= NB_OUTPUT; | ||||||
|  |             err += tmp_err; | ||||||
|  |  | ||||||
|  |             BackwardPass(cost[j], input[j], network); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         err /= datasetsize; | ||||||
|  |         printf("Erreur : %f\n", err); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < datasetsize; i++) | ||||||
|  |     { | ||||||
|  |         free(input[i]); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < datasetsize; i++) | ||||||
|  |     { | ||||||
|  |         free(cost[i]); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     free(input); | ||||||
|  |     free(cost); | ||||||
|  | } | ||||||
							
								
								
									
										8
									
								
								NeuralNetwork/training.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,8 @@ | |||||||
|  | #ifndef TRAINING_H | ||||||
|  | #define TRAINING_H | ||||||
|  |  | ||||||
|  | #include "structure.h" | ||||||
|  |  | ||||||
|  | void training(Neural_Network *network, int nb_repetition); | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										129
									
								
								NeuralNetwork/traitement.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,129 @@ | |||||||
|  | #include "traitement.h" | ||||||
|  |  | ||||||
|  | #include <math.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <time.h> | ||||||
|  |  | ||||||
|  | #include "structure.h" | ||||||
|  | #include "toolsnetworks.h" | ||||||
|  | #include "training.h" | ||||||
|  |  | ||||||
|  | #define NB_PIXEL 400 | ||||||
|  | #define NB_OUTPUT 65 | ||||||
|  | #define DELTA 0.2 | ||||||
|  |  | ||||||
|  | // Fonctions de traitement du reseau de neurone : Initialisation, Forwardpass | ||||||
|  | // et backpropagation. | ||||||
|  |  | ||||||
|  | void Initialisation(Neural_Network *network) | ||||||
|  | { | ||||||
|  |     network->nb_layers = 2; | ||||||
|  |     network->layers = (Neural_Network_Layer *)malloc( | ||||||
|  |         network->nb_layers * sizeof(Neural_Network_Layer)); | ||||||
|  |     network->layers[0] = Create_Layer((int)NB_PIXEL * 2 / 3, NB_PIXEL); | ||||||
|  |     network->layers[1] = Create_Layer(NB_OUTPUT, (int)NB_PIXEL * 2 / 3); | ||||||
|  |     network->output = 0.0; | ||||||
|  |     network->nboutput = NB_OUTPUT; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < network->nb_layers; i++) | ||||||
|  |     { | ||||||
|  |         for (int j = 0; j < network->layers[i].nb_cells; j++) | ||||||
|  |         { | ||||||
|  |             network->layers[i].cells[j].biais = my_rand(); | ||||||
|  |             for (int k = 0; k < network->layers[i].cells[j].nb_weight; k++) | ||||||
|  |             { | ||||||
|  |                 network->layers[i].cells[j].weights[k] = my_rand(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void ForwardPass(double entries[], Neural_Network *network) | ||||||
|  | { | ||||||
|  |     // Le passage de Xor à OCR est similaire pour le traitement du premier | ||||||
|  |     // layer. | ||||||
|  |     Neural_Network_Layer layer, previous_layer; | ||||||
|  |  | ||||||
|  |     // First Layer treatment | ||||||
|  |     layer = (*network).layers[0]; | ||||||
|  |     for (int i = 0; i < layer.nb_cells; i++) | ||||||
|  |     { | ||||||
|  |         Neural_Network_Cell cell = layer.cells[i]; | ||||||
|  |         double tmp = cell.biais; | ||||||
|  |         for (int j = 0; j < cell.nb_weight; j++) | ||||||
|  |         { | ||||||
|  |             tmp += cell.weights[j] * entries[j]; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         (*network).layers[0].cells[i].output = sigmoid(tmp); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Cette fois, on a plus qu'un noeud en output, donc plus de network.output | ||||||
|  |     // en int, mais on peut mettre un char à la place pour accéder au résultat | ||||||
|  |     // renvoyé par notre réseau. | ||||||
|  |  | ||||||
|  |     // Output Layer treatment | ||||||
|  |     layer = (*network).layers[(*network).nb_layers - 1]; | ||||||
|  |     previous_layer = (*network).layers[0]; | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < layer.nb_cells; i++) | ||||||
|  |     { | ||||||
|  |         Neural_Network_Cell cell = layer.cells[i]; | ||||||
|  |         double tmp = cell.biais; | ||||||
|  |  | ||||||
|  |         for (int k = 0; k < cell.nb_weight; k++) | ||||||
|  |         { | ||||||
|  |             tmp += cell.weights[k] * previous_layer.cells[k].output; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         (*network).layers[1].cells[i].output = tmp; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     softmax(&layer); | ||||||
|  |     (*network).output = getIndiceMax(network); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void BackwardPass(double *expected, double *entries, Neural_Network *network) | ||||||
|  | { | ||||||
|  |     for (int i = 0; i < network->nboutput; i++) | ||||||
|  |     { | ||||||
|  |         double cell_output = (*network).layers[1].cells[i].output; | ||||||
|  |         double dCell_output = cell_output * (1 - cell_output); | ||||||
|  |         double dError = (expected[i] - cell_output); | ||||||
|  |  | ||||||
|  |         for (int j = 0; j < (*network).layers[1].cells[i].nb_weight; j++) | ||||||
|  |         { | ||||||
|  |             double f = (*network).layers[0].cells[j].output; | ||||||
|  |  | ||||||
|  |             (*network).layers[1].cells[i].previous_dError[j] = | ||||||
|  |                 (*network).layers[1].cells[i].weights[j] * dCell_output | ||||||
|  |                 * dError; | ||||||
|  |  | ||||||
|  |             (*network).layers[1].cells[i].weights[j] += | ||||||
|  |                 DELTA * f * dCell_output * dError; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         (*network).layers[1].cells[i].biais += DELTA * dCell_output * dError; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for (int i = 0; i < (*network).layers[0].nb_cells; i++) | ||||||
|  |     { | ||||||
|  |         double cell_output = (*network).layers[0].cells[i].output; | ||||||
|  |         double dg = cell_output * (1 - cell_output); | ||||||
|  |         double dError = 0; | ||||||
|  |  | ||||||
|  |         for (int j = 0; j < (*network).layers[1].nb_cells; j++) | ||||||
|  |         { | ||||||
|  |             dError += (*network).layers[1].cells[j].previous_dError[i]; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         for (int j = 0; j < (*network).layers[0].cells[i].nb_weight; j++) | ||||||
|  |         { | ||||||
|  |             double f = entries[j]; | ||||||
|  |             (*network).layers[0].cells[i].weights[j] += DELTA * f * dg * dError; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         (*network).layers[0].cells[i].biais += DELTA * dg * dError; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										11
									
								
								NeuralNetwork/traitement.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,11 @@ | |||||||
|  | #ifndef TRAITEMENT_H | ||||||
|  | #define TRAITEMENT_H | ||||||
|  | #include "structure.h" | ||||||
|  |  | ||||||
|  | void Initialisation(Neural_Network *network); | ||||||
|  |  | ||||||
|  | void ForwardPass(double entries[], Neural_Network *network); | ||||||
|  |  | ||||||
|  | void BackwardPass(double *expected, double *entries, Neural_Network *network); | ||||||
|  |  | ||||||
|  | #endif | ||||||
							
								
								
									
										20
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,20 @@ | |||||||
|  | # OCR | ||||||
|  |  | ||||||
|  | This project implement an OCR in C. The OCR use a one layer neural network to reconise charactere. | ||||||
|  |  | ||||||
|  | ## Compile | ||||||
|  |  | ||||||
|  | You can use this program with this command | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | make | ||||||
|  | ./OCR | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | When the program run you should first load an image in BitMap format | ||||||
|  |  | ||||||
|  | Then you can upgrade the quality of your image with our different options. When you are ready simply press ```play``` | ||||||
|  |  | ||||||
|  | ## Clean | ||||||
|  |  | ||||||
|  | Use ```make clean``` to delete all trash files | ||||||
							
								
								
									
										10
									
								
								all.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,10 @@ | |||||||
|  | #include "ImageTreatment/Filter/cleanerimage.h" | ||||||
|  | #include "ImageTreatment/Segmentation/segmentation.h" | ||||||
|  | #include "ImageTreatment/Tools/tools.h" | ||||||
|  | #include "ImageTreatment/display.h" | ||||||
|  | #include "ImageTreatment/extraction/extractchar.h" | ||||||
|  | #include "ImageTreatment/extraction/extraction.h" | ||||||
|  | #include "NeuralNetwork/structure.h" | ||||||
|  | #include "NeuralNetwork/toolsnetworks.h" | ||||||
|  | #include "NeuralNetwork/training.h" | ||||||
|  | #include "NeuralNetwork/traitement.h" | ||||||
							
								
								
									
										
											BIN
										
									
								
								images/temp.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 908 KiB | 
							
								
								
									
										230
									
								
								main.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,230 @@ | |||||||
|  | #include <SDL2/SDL.h> | ||||||
|  | #include <err.h> | ||||||
|  | #include <gtk/gtk.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  |  | ||||||
|  | #include "all.h" | ||||||
|  |  | ||||||
|  | GtkWidget *window; | ||||||
|  | GtkWidget *wimage; | ||||||
|  | GtkWidget *image; | ||||||
|  | GtkWidget *textBox; | ||||||
|  | GtkWidget *final; | ||||||
|  | GtkWidget *ninety; | ||||||
|  | GtkWidget *oneeighty; | ||||||
|  | GtkWidget *segm; | ||||||
|  | GtkWidget *grays; | ||||||
|  | GtkWidget *contra; | ||||||
|  | GtkWidget *biner; | ||||||
|  | GtkWidget *play; | ||||||
|  | GtkWidget *noise; | ||||||
|  | GtkWidget *rotation; | ||||||
|  | GtkWidget *nette; | ||||||
|  | SDL_Surface *surf; | ||||||
|  |  | ||||||
|  | int main(int argc, char *argv[]) | ||||||
|  | { | ||||||
|  |     SDL_Init(SDL_INIT_VIDEO); | ||||||
|  |     GtkBuilder *builder; | ||||||
|  |     gtk_init(&argc, &argv); | ||||||
|  |     builder = gtk_builder_new(); | ||||||
|  |     gtk_builder_add_from_file(builder, "main.glade", NULL); | ||||||
|  |     window = GTK_WIDGET(gtk_builder_get_object(builder, "window")); | ||||||
|  |     gtk_builder_connect_signals(builder, NULL); | ||||||
|  |     final = GTK_WIDGET(gtk_builder_get_object(builder, "final")); | ||||||
|  |     textBox = GTK_WIDGET(gtk_builder_get_object(builder, "textBox")); | ||||||
|  |     ninety = GTK_WIDGET(gtk_builder_get_object(builder, "ninety")); | ||||||
|  |     oneeighty = GTK_WIDGET(gtk_builder_get_object(builder, "oneeighty")); | ||||||
|  |     segm = GTK_WIDGET(gtk_builder_get_object(builder, "segmentation")); | ||||||
|  |     grays = GTK_WIDGET(gtk_builder_get_object(builder, "grayscale")); | ||||||
|  |     contra = GTK_WIDGET(gtk_builder_get_object(builder, "contrastes")); | ||||||
|  |     biner = GTK_WIDGET(gtk_builder_get_object(builder, "binarisation")); | ||||||
|  |     play = GTK_WIDGET(gtk_builder_get_object(builder, "lanceTout")); | ||||||
|  |     noise = GTK_WIDGET(gtk_builder_get_object(builder, "noise")); | ||||||
|  |     rotation = GTK_WIDGET(gtk_builder_get_object(builder, "rotation")); | ||||||
|  |     nette = GTK_WIDGET(gtk_builder_get_object(builder, "nettete")); | ||||||
|  |     g_object_unref(builder); | ||||||
|  |     gtk_widget_show(window); | ||||||
|  |     g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); | ||||||
|  |     gtk_main(); | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | SDL_Surface *load_image(char *path) | ||||||
|  | { | ||||||
|  |     SDL_Surface *img; | ||||||
|  |     img = SDL_LoadBMP(path); | ||||||
|  |     if (!img) | ||||||
|  |         errx(3, "Can't load %s: %s", path, SDL_GetError()); | ||||||
|  |     return img; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void choose_image(char *file) | ||||||
|  | { | ||||||
|  |     gtk_widget_set_sensitive(ninety, TRUE); | ||||||
|  |     gtk_widget_set_sensitive(segm, TRUE); | ||||||
|  |     gtk_widget_set_sensitive(play, TRUE); | ||||||
|  |     gtk_widget_set_sensitive(grays, TRUE); | ||||||
|  |     gtk_widget_set_sensitive(contra, TRUE); | ||||||
|  |     gtk_widget_set_sensitive(biner, TRUE); | ||||||
|  |     gtk_widget_set_sensitive(noise, TRUE); | ||||||
|  |     gtk_widget_set_sensitive(rotation, TRUE); | ||||||
|  |     gtk_widget_set_sensitive(oneeighty, TRUE); | ||||||
|  |     gtk_widget_set_sensitive(nette, TRUE); | ||||||
|  |     surf = load_image(file); | ||||||
|  |     SDL_SaveBMP(surf, "images/temp.bmp"); | ||||||
|  |     SDL_FreeSurface(surf); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void file_selected(GtkWidget *filechooserbutton) | ||||||
|  | { | ||||||
|  |     char *filename = | ||||||
|  |         gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filechooserbutton)); | ||||||
|  |     printf("%s\n", filename); | ||||||
|  |     choose_image(filename); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Il faut juste que tu mettes tes fonctions à la place des commentaires. Si | ||||||
|  | // jamais tu as pas certaines fonctions par exemple pour recup le resultat du | ||||||
|  | // reseau de neurones dis le moi et je les demanderai à Axelle ou Brice. | ||||||
|  |  | ||||||
|  | // Pour les fonctions, l'image à modifier est sauvegardée dans le fichier | ||||||
|  | // images/temp.bmp | ||||||
|  |  | ||||||
|  | void play_button() | ||||||
|  | { | ||||||
|  |     GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textBox)); | ||||||
|  |     GtkTextIter iter; | ||||||
|  |     gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0); | ||||||
|  |     char *result = calloc(sizeof(char), 10000); | ||||||
|  |  | ||||||
|  |     // result sera le texte final | ||||||
|  |     // traitement de l'image (dans le fichier images/temp.bmp) | ||||||
|  |     // segmentation de l'image | ||||||
|  |     // envoi au reseau de neurones | ||||||
|  |     // stockage du resultat du reseau de neurones dans la variable result | ||||||
|  |     SDL_Surface *loadedImage = SDL_LoadBMP("images/temp.bmp"); | ||||||
|  |     binerize(loadedImage); | ||||||
|  |     Neural_Network *network = (Neural_Network *)malloc(sizeof(Neural_Network)); | ||||||
|  |     Initialisation(network); | ||||||
|  |     Load_Network(network, "SaveNetwork.txt"); | ||||||
|  |     __extractpar(loadedImage, network, result); | ||||||
|  |     Free_Network(network); | ||||||
|  |     SDL_FreeSurface(loadedImage); | ||||||
|  |     gtk_text_buffer_insert(buffer, &iter, result, -1); | ||||||
|  |     free(result); | ||||||
|  |     gtk_widget_show(final); | ||||||
|  |     gtk_widget_hide(window); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void nettete() | ||||||
|  | { | ||||||
|  |     static float SharpenMatrix[3][3] = { { 0.0, -1.0, 0.0 }, | ||||||
|  |                                          { -1.0, 5.0, -1.0 }, | ||||||
|  |                                          { 0.0, -1.0, 0.0 } }; | ||||||
|  |     SDL_Surface *loadedImage = SDL_LoadBMP("images/temp.bmp"); | ||||||
|  |     SDL_Window *window = display_img(loadedImage); | ||||||
|  |     wait_for_keypressed(); | ||||||
|  |     SDL_DestroyWindow(window); | ||||||
|  |     loadedImage = Convolute(loadedImage, SharpenMatrix); | ||||||
|  |     window = display_img(loadedImage); | ||||||
|  |     SDL_SaveBMP(loadedImage, "images/temp.bmp"); | ||||||
|  |     wait_for_keypressed(); | ||||||
|  |     SDL_DestroyWindow(window); | ||||||
|  |     SDL_FreeSurface(loadedImage); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void plus_oneeighty() | ||||||
|  | { | ||||||
|  |     SDL_Surface *loadedImage = SDL_LoadBMP("images/temp.bmp"); | ||||||
|  |     SDL_Window *window = display_img(loadedImage); | ||||||
|  |     wait_for_keypressed(); | ||||||
|  |     SDL_DestroyWindow(window); | ||||||
|  |     grayscale(loadedImage); | ||||||
|  |     binerize(loadedImage); | ||||||
|  |     loadedImage = rotate(180, loadedImage); | ||||||
|  |     window = display_img(loadedImage); | ||||||
|  |     SDL_SaveBMP(loadedImage, "images/temp.bmp"); | ||||||
|  |     wait_for_keypressed(); | ||||||
|  |     SDL_DestroyWindow(window); | ||||||
|  |     SDL_FreeSurface(loadedImage); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void plus_ninety() | ||||||
|  | { | ||||||
|  |     SDL_Surface *loadedImage = SDL_LoadBMP("images/temp.bmp"); | ||||||
|  |     SDL_Window *window = display_img(loadedImage); | ||||||
|  |     wait_for_keypressed(); | ||||||
|  |     SDL_DestroyWindow(window); | ||||||
|  |     grayscale(loadedImage); | ||||||
|  |     binerize(loadedImage); | ||||||
|  |     loadedImage = rotate(90, loadedImage); | ||||||
|  |     window = display_img(loadedImage); | ||||||
|  |     SDL_SaveBMP(loadedImage, "images/temp.bmp"); | ||||||
|  |     wait_for_keypressed(); | ||||||
|  |     SDL_DestroyWindow(window); | ||||||
|  |     SDL_FreeSurface(loadedImage); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void gray() | ||||||
|  | { | ||||||
|  |     // grayscale | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void bine() | ||||||
|  | { | ||||||
|  |     // binarisation | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void seg() | ||||||
|  | {} | ||||||
|  |  | ||||||
|  | void cont() | ||||||
|  | { | ||||||
|  |     SDL_Surface *loadedImage = SDL_LoadBMP("images/temp.bmp"); | ||||||
|  |     SDL_Window *window = display_img(loadedImage); | ||||||
|  |     wait_for_keypressed(); | ||||||
|  |     SDL_DestroyWindow(window); | ||||||
|  |     ConstrastRenforcement(loadedImage, 100); | ||||||
|  |     window = display_img(loadedImage); | ||||||
|  |     wait_for_keypressed(); | ||||||
|  |     SDL_DestroyWindow(window); | ||||||
|  |     SDL_FreeSurface(loadedImage); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void rot() | ||||||
|  | { | ||||||
|  |     SDL_Surface *loadedImage = SDL_LoadBMP("images/temp.bmp"); | ||||||
|  |     SDL_Window *window = display_img(loadedImage); | ||||||
|  |     wait_for_keypressed(); | ||||||
|  |     SDL_DestroyWindow(window); | ||||||
|  |     binerize(loadedImage); | ||||||
|  |     grayscale(loadedImage); | ||||||
|  |     double teta = houghtrasformy(loadedImage); | ||||||
|  |     teta -= 90; | ||||||
|  |     loadedImage = rotate(teta, loadedImage); | ||||||
|  |     window = display_img(loadedImage); | ||||||
|  |     SDL_SaveBMP(loadedImage, "images/temp.bmp"); | ||||||
|  |     wait_for_keypressed(); | ||||||
|  |     SDL_DestroyWindow(window); | ||||||
|  |     SDL_FreeSurface(loadedImage); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void noise_reduction() | ||||||
|  | { | ||||||
|  |     SDL_Surface *loadedImage = SDL_LoadBMP("images/temp.bmp"); | ||||||
|  |     SDL_Window *window = display_img(loadedImage); | ||||||
|  |     wait_for_keypressed(); | ||||||
|  |     SDL_DestroyWindow(window); | ||||||
|  |     noiseReduction(loadedImage); | ||||||
|  |     window = display_img(loadedImage); | ||||||
|  |     wait_for_keypressed(); | ||||||
|  |     SDL_DestroyWindow(window); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void on_quit_clicked() | ||||||
|  | { | ||||||
|  |     gtk_main_quit(); | ||||||
|  | } | ||||||
							
								
								
									
										320
									
								
								main.glade
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,320 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <!-- Generated with glade 3.38.1 --> | ||||||
|  | <interface> | ||||||
|  |   <requires lib="gtk+" version="3.24"/> | ||||||
|  |   <object class="GtkFileFilter" id="filefilter1"> | ||||||
|  |     <patterns> | ||||||
|  |       <pattern>*.bmp</pattern> | ||||||
|  |     </patterns> | ||||||
|  |   </object> | ||||||
|  |   <object class="GtkWindow" id="window"> | ||||||
|  |     <property name="name">window</property> | ||||||
|  |     <property name="can-focus">False</property> | ||||||
|  |     <property name="opacity">0.9</property> | ||||||
|  |     <property name="title" translatable="yes">window</property> | ||||||
|  |     <property name="window-position">center</property> | ||||||
|  |     <property name="type-hint">utility</property> | ||||||
|  |     <property name="has-resize-grip">True</property> | ||||||
|  |     <signal name="destroy" handler="destroy" swapped="no"/> | ||||||
|  |     <child> | ||||||
|  |       <object class="GtkFixed" id="fixed1"> | ||||||
|  |         <property name="visible">True</property> | ||||||
|  |         <property name="can-focus">False</property> | ||||||
|  |         <child> | ||||||
|  |           <object class="GtkButton" id="lanceTout"> | ||||||
|  |             <property name="label">Play</property> | ||||||
|  |             <property name="name">play</property> | ||||||
|  |             <property name="width-request">100</property> | ||||||
|  |             <property name="height-request">80</property> | ||||||
|  |             <property name="visible">True</property> | ||||||
|  |             <property name="sensitive">False</property> | ||||||
|  |             <property name="can-focus">True</property> | ||||||
|  |             <property name="receives-default">True</property> | ||||||
|  |             <property name="resize-mode">immediate</property> | ||||||
|  |             <signal name="clicked" handler="play_button" swapped="no"/> | ||||||
|  |           </object> | ||||||
|  |           <packing> | ||||||
|  |             <property name="x">400</property> | ||||||
|  |             <property name="y">55</property> | ||||||
|  |           </packing> | ||||||
|  |         </child> | ||||||
|  |         <child> | ||||||
|  |           <object class="GtkLabel" id="label2"> | ||||||
|  |             <property name="width-request">100</property> | ||||||
|  |             <property name="height-request">30</property> | ||||||
|  |             <property name="visible">True</property> | ||||||
|  |             <property name="can-focus">False</property> | ||||||
|  |             <property name="label" translatable="yes">Choose a file</property> | ||||||
|  |             <property name="angle">0.06</property> | ||||||
|  |           </object> | ||||||
|  |           <packing> | ||||||
|  |             <property name="x">50</property> | ||||||
|  |             <property name="y">20</property> | ||||||
|  |           </packing> | ||||||
|  |         </child> | ||||||
|  |         <child> | ||||||
|  |           <object class="GtkButton" id="ninety"> | ||||||
|  |             <property name="label" translatable="yes">+90°</property> | ||||||
|  |             <property name="name">ninety</property> | ||||||
|  |             <property name="width-request">100</property> | ||||||
|  |             <property name="height-request">80</property> | ||||||
|  |             <property name="visible">True</property> | ||||||
|  |             <property name="sensitive">False</property> | ||||||
|  |             <property name="can-focus">True</property> | ||||||
|  |             <property name="receives-default">True</property> | ||||||
|  |             <property name="resize-mode">immediate</property> | ||||||
|  |             <signal name="clicked" handler="plus_ninety" swapped="no"/> | ||||||
|  |           </object> | ||||||
|  |           <packing> | ||||||
|  |             <property name="x">410</property> | ||||||
|  |             <property name="y">250</property> | ||||||
|  |           </packing> | ||||||
|  |         </child> | ||||||
|  |         <child> | ||||||
|  |           <object class="GtkLabel" id="label3"> | ||||||
|  |             <property name="width-request">150</property> | ||||||
|  |             <property name="height-request">80</property> | ||||||
|  |             <property name="visible">True</property> | ||||||
|  |             <property name="can-focus">False</property> | ||||||
|  |             <property name="label" translatable="yes">OCRigolo</property> | ||||||
|  |             <property name="justify">center</property> | ||||||
|  |             <property name="ellipsize">middle</property> | ||||||
|  |             <attributes> | ||||||
|  |               <attribute name="style" value="normal"/> | ||||||
|  |               <attribute name="weight" value="heavy"/> | ||||||
|  |               <attribute name="variant" value="small-caps"/> | ||||||
|  |               <attribute name="scale" value="1"/> | ||||||
|  |               <attribute name="strikethrough-color" value="#ffffffffffff"/> | ||||||
|  |             </attributes> | ||||||
|  |           </object> | ||||||
|  |           <packing> | ||||||
|  |             <property name="x">200</property> | ||||||
|  |             <property name="y">40</property> | ||||||
|  |           </packing> | ||||||
|  |         </child> | ||||||
|  |         <child> | ||||||
|  |           <object class="GtkButton" id="quit"> | ||||||
|  |             <property name="label">gtk-quit</property> | ||||||
|  |             <property name="width-request">500</property> | ||||||
|  |             <property name="height-request">28</property> | ||||||
|  |             <property name="visible">True</property> | ||||||
|  |             <property name="can-focus">True</property> | ||||||
|  |             <property name="receives-default">True</property> | ||||||
|  |             <property name="halign">start</property> | ||||||
|  |             <property name="margin-left">5</property> | ||||||
|  |             <property name="margin-right">5</property> | ||||||
|  |             <property name="margin-top">5</property> | ||||||
|  |             <property name="margin-bottom">5</property> | ||||||
|  |             <property name="border-width">5</property> | ||||||
|  |             <property name="use-stock">True</property> | ||||||
|  |             <property name="xalign">0.44999998807907104</property> | ||||||
|  |             <property name="always-show-image">True</property> | ||||||
|  |             <signal name="clicked" handler="on_quit_clicked" swapped="no"/> | ||||||
|  |           </object> | ||||||
|  |           <packing> | ||||||
|  |             <property name="x">25</property> | ||||||
|  |             <property name="y">330</property> | ||||||
|  |           </packing> | ||||||
|  |         </child> | ||||||
|  |         <child> | ||||||
|  |           <object class="GtkFileChooserButton" id="filechooserbutton1"> | ||||||
|  |             <property name="name">chooser</property> | ||||||
|  |             <property name="width-request">100</property> | ||||||
|  |             <property name="height-request">80</property> | ||||||
|  |             <property name="visible">True</property> | ||||||
|  |             <property name="can-focus">False</property> | ||||||
|  |             <property name="filter">filefilter1</property> | ||||||
|  |             <signal name="file-set" handler="file_selected" swapped="no"/> | ||||||
|  |           </object> | ||||||
|  |           <packing> | ||||||
|  |             <property name="x">50</property> | ||||||
|  |             <property name="y">55</property> | ||||||
|  |           </packing> | ||||||
|  |         </child> | ||||||
|  |         <child> | ||||||
|  |           <object class="GtkButton" id="grayscale"> | ||||||
|  |             <property name="label" translatable="yes">grayscale</property> | ||||||
|  |             <property name="name">grays</property> | ||||||
|  |             <property name="width-request">100</property> | ||||||
|  |             <property name="height-request">80</property> | ||||||
|  |             <property name="visible">True</property> | ||||||
|  |             <property name="sensitive">False</property> | ||||||
|  |             <property name="can-focus">True</property> | ||||||
|  |             <property name="receives-default">True</property> | ||||||
|  |             <property name="resize-mode">immediate</property> | ||||||
|  |             <signal name="clicked" handler="gray" swapped="no"/> | ||||||
|  |           </object> | ||||||
|  |           <packing> | ||||||
|  |             <property name="x">40</property> | ||||||
|  |             <property name="y">150</property> | ||||||
|  |           </packing> | ||||||
|  |         </child> | ||||||
|  |         <child> | ||||||
|  |           <object class="GtkButton" id="binarisation"> | ||||||
|  |             <property name="label" translatable="yes">binerize</property> | ||||||
|  |             <property name="name">biner</property> | ||||||
|  |             <property name="width-request">100</property> | ||||||
|  |             <property name="height-request">80</property> | ||||||
|  |             <property name="visible">True</property> | ||||||
|  |             <property name="sensitive">False</property> | ||||||
|  |             <property name="can-focus">True</property> | ||||||
|  |             <property name="receives-default">True</property> | ||||||
|  |             <property name="resize-mode">immediate</property> | ||||||
|  |             <signal name="clicked" handler="bine" swapped="no"/> | ||||||
|  |           </object> | ||||||
|  |           <packing> | ||||||
|  |             <property name="x">165</property> | ||||||
|  |             <property name="y">250</property> | ||||||
|  |           </packing> | ||||||
|  |         </child> | ||||||
|  |         <child> | ||||||
|  |           <object class="GtkButton" id="contrastes"> | ||||||
|  |             <property name="label" translatable="yes">contrasts</property> | ||||||
|  |             <property name="name">contra</property> | ||||||
|  |             <property name="width-request">100</property> | ||||||
|  |             <property name="height-request">80</property> | ||||||
|  |             <property name="visible">True</property> | ||||||
|  |             <property name="sensitive">False</property> | ||||||
|  |             <property name="can-focus">True</property> | ||||||
|  |             <property name="receives-default">True</property> | ||||||
|  |             <property name="resize-mode">immediate</property> | ||||||
|  |             <signal name="clicked" handler="cont" swapped="no"/> | ||||||
|  |           </object> | ||||||
|  |           <packing> | ||||||
|  |             <property name="x">410</property> | ||||||
|  |             <property name="y">150</property> | ||||||
|  |           </packing> | ||||||
|  |         </child> | ||||||
|  |         <child> | ||||||
|  |           <object class="GtkButton" id="noise"> | ||||||
|  |             <property name="label" translatable="yes">noise</property> | ||||||
|  |             <property name="name">noise</property> | ||||||
|  |             <property name="width-request">100</property> | ||||||
|  |             <property name="height-request">80</property> | ||||||
|  |             <property name="visible">True</property> | ||||||
|  |             <property name="sensitive">False</property> | ||||||
|  |             <property name="can-focus">True</property> | ||||||
|  |             <property name="receives-default">True</property> | ||||||
|  |             <property name="resize-mode">immediate</property> | ||||||
|  |             <signal name="clicked" handler="noise_reduction" swapped="no"/> | ||||||
|  |           </object> | ||||||
|  |           <packing> | ||||||
|  |             <property name="x">285</property> | ||||||
|  |             <property name="y">150</property> | ||||||
|  |           </packing> | ||||||
|  |         </child> | ||||||
|  |         <child> | ||||||
|  |           <object class="GtkButton" id="rotation"> | ||||||
|  |             <property name="label" translatable="yes">rotation</property> | ||||||
|  |             <property name="name">rotation</property> | ||||||
|  |             <property name="width-request">100</property> | ||||||
|  |             <property name="height-request">80</property> | ||||||
|  |             <property name="visible">True</property> | ||||||
|  |             <property name="sensitive">False</property> | ||||||
|  |             <property name="can-focus">True</property> | ||||||
|  |             <property name="receives-default">True</property> | ||||||
|  |             <property name="resize-mode">immediate</property> | ||||||
|  |             <signal name="clicked" handler="rot" swapped="no"/> | ||||||
|  |           </object> | ||||||
|  |           <packing> | ||||||
|  |             <property name="x">40</property> | ||||||
|  |             <property name="y">250</property> | ||||||
|  |           </packing> | ||||||
|  |         </child> | ||||||
|  |         <child> | ||||||
|  |           <object class="GtkButton" id="nettete"> | ||||||
|  |             <property name="label" translatable="yes">sharpness</property> | ||||||
|  |             <property name="name">nette</property> | ||||||
|  |             <property name="width-request">100</property> | ||||||
|  |             <property name="height-request">80</property> | ||||||
|  |             <property name="visible">True</property> | ||||||
|  |             <property name="sensitive">False</property> | ||||||
|  |             <property name="can-focus">True</property> | ||||||
|  |             <property name="receives-default">True</property> | ||||||
|  |             <property name="resize-mode">immediate</property> | ||||||
|  |             <signal name="clicked" handler="nettete" swapped="no"/> | ||||||
|  |           </object> | ||||||
|  |           <packing> | ||||||
|  |             <property name="x">165</property> | ||||||
|  |             <property name="y">150</property> | ||||||
|  |           </packing> | ||||||
|  |         </child> | ||||||
|  |         <child> | ||||||
|  |           <object class="GtkButton" id="oneeighty"> | ||||||
|  |             <property name="label" translatable="yes">+180°</property> | ||||||
|  |             <property name="name">oneeighty</property> | ||||||
|  |             <property name="width-request">100</property> | ||||||
|  |             <property name="height-request">80</property> | ||||||
|  |             <property name="visible">True</property> | ||||||
|  |             <property name="sensitive">False</property> | ||||||
|  |             <property name="can-focus">True</property> | ||||||
|  |             <property name="receives-default">True</property> | ||||||
|  |             <property name="resize-mode">immediate</property> | ||||||
|  |             <signal name="clicked" handler="plus_oneeighty" swapped="no"/> | ||||||
|  |           </object> | ||||||
|  |           <packing> | ||||||
|  |             <property name="x">285</property> | ||||||
|  |             <property name="y">250</property> | ||||||
|  |           </packing> | ||||||
|  |         </child> | ||||||
|  |       </object> | ||||||
|  |     </child> | ||||||
|  |   </object> | ||||||
|  |   <object class="GtkWindow" id="final"> | ||||||
|  |     <property name="width-request">640</property> | ||||||
|  |     <property name="can-focus">False</property> | ||||||
|  |     <property name="margin-bottom">1</property> | ||||||
|  |     <child> | ||||||
|  |       <object class="GtkFixed" id="fixed2"> | ||||||
|  |         <property name="width-request">640</property> | ||||||
|  |         <property name="visible">True</property> | ||||||
|  |         <property name="can-focus">False</property> | ||||||
|  |         <child> | ||||||
|  |           <object class="GtkTextView" id="textBox"> | ||||||
|  |             <property name="name">textBox</property> | ||||||
|  |             <property name="width-request">640</property> | ||||||
|  |             <property name="height-request">460</property> | ||||||
|  |             <property name="visible">True</property> | ||||||
|  |             <property name="can-focus">True</property> | ||||||
|  |           </object> | ||||||
|  |           <packing> | ||||||
|  |             <property name="y">67</property> | ||||||
|  |           </packing> | ||||||
|  |         </child> | ||||||
|  |         <child> | ||||||
|  |           <object class="GtkLabel" id="label4"> | ||||||
|  |             <property name="width-request">100</property> | ||||||
|  |             <property name="height-request">80</property> | ||||||
|  |             <property name="visible">True</property> | ||||||
|  |             <property name="can-focus">False</property> | ||||||
|  |             <property name="label" translatable="yes">Result :</property> | ||||||
|  |           </object> | ||||||
|  |           <packing> | ||||||
|  |             <property name="x">265</property> | ||||||
|  |           </packing> | ||||||
|  |         </child> | ||||||
|  |         <child> | ||||||
|  |           <object class="GtkButton" id="quit1"> | ||||||
|  |             <property name="label">gtk-quit</property> | ||||||
|  |             <property name="width-request">465</property> | ||||||
|  |             <property name="height-request">28</property> | ||||||
|  |             <property name="visible">True</property> | ||||||
|  |             <property name="can-focus">True</property> | ||||||
|  |             <property name="receives-default">True</property> | ||||||
|  |             <property name="halign">start</property> | ||||||
|  |             <property name="margin-top">5</property> | ||||||
|  |             <property name="margin-bottom">5</property> | ||||||
|  |             <property name="border-width">5</property> | ||||||
|  |             <property name="use-stock">True</property> | ||||||
|  |             <property name="always-show-image">True</property> | ||||||
|  |             <signal name="clicked" handler="on_quit_clicked" swapped="no"/> | ||||||
|  |           </object> | ||||||
|  |           <packing> | ||||||
|  |             <property name="x">33</property> | ||||||
|  |             <property name="y">529</property> | ||||||
|  |           </packing> | ||||||
|  |         </child> | ||||||
|  |       </object> | ||||||
|  |     </child> | ||||||
|  |   </object> | ||||||
|  | </interface> | ||||||
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-1.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-10.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-11.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-12.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-13.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-14.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-15.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-16.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-17.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-18.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-19.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-2.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-20.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-21.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-22.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-23.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-24.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-25.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-26.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-27.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-28.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-29.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-3.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-30.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-31.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-32.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-33.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-34.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-35.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-36.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-37.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-38.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-39.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-4.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-40.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-41.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-42.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-43.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-44.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-45.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-46.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-47.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-48.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-49.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-5.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-50.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-51.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-52.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-53.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-6.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-7.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-8.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-0-9.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-1-1.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-1-10.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-1-11.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-1-12.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-1-13.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-1-14.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-1-15.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-1-16.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-1-17.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-1-18.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-1-19.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-1-2.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-1-20.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-1-21.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-1-22.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-1-23.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-1-24.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/Dataset/image-1-25.bmp
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB |