OCR project
This commit is contained in:
166
ImageTreatment/Filter/cleanerimage.c
Normal file
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
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
|
||||
Reference in New Issue
Block a user