167 lines
4.1 KiB
C
167 lines
4.1 KiB
C
|
#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);
|
||
|
}
|
||
|
}
|
||
|
}
|