152 lines
2.8 KiB
C
152 lines
2.8 KiB
C
|
/*
|
|||
|
detect.c
|
|||
|
--------
|
|||
|
*/
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
#include <stdlib.h>
|
|||
|
|
|||
|
#include "tthimage.h"
|
|||
|
|
|||
|
/*::------------------------------------------------------------------::*/
|
|||
|
/*
|
|||
|
* this function detect all the pixels who the value is
|
|||
|
* over the values of all his 8 neight-machin.
|
|||
|
*/
|
|||
|
int
|
|||
|
Image_detect_tops(Image_Desc *src, Image_Desc *dst, int flags)
|
|||
|
{
|
|||
|
int x, y, foo, top, r, g, b, rm, gm, bm;
|
|||
|
static struct
|
|||
|
{
|
|||
|
int x, y;
|
|||
|
} d[] =
|
|||
|
{
|
|||
|
{ -1, -1 },
|
|||
|
{ 0, -1 },
|
|||
|
{ 1, -1 },
|
|||
|
{ -1, 0 },
|
|||
|
{ 1, 0 },
|
|||
|
{ -1, 1 },
|
|||
|
{ 0, 1 },
|
|||
|
{ 1, 1 }
|
|||
|
};
|
|||
|
|
|||
|
if ( (foo=Image_compare_desc(src, dst)) )
|
|||
|
{
|
|||
|
fprintf(stderr, "Detect Tops: erreur: %s\n", Image_err2str(foo));
|
|||
|
return foo;
|
|||
|
}
|
|||
|
|
|||
|
Image_clear(dst, 0, 0, 0);
|
|||
|
for (y=1; y<src->height-1; y++)
|
|||
|
{
|
|||
|
for (x=1; x<src->width-1; x++)
|
|||
|
{
|
|||
|
top = 0;
|
|||
|
for (foo=0; foo<8; foo++)
|
|||
|
{
|
|||
|
r = Image_R_pixel(src, x+d[foo].x, y+d[foo].y);
|
|||
|
if (r > top) top = r;
|
|||
|
}
|
|||
|
r = Image_R_pixel(src, x, y);
|
|||
|
if (r > top) rm = 255;
|
|||
|
else rm = 0;
|
|||
|
|
|||
|
top = 0;
|
|||
|
for (foo=0; foo<8; foo++)
|
|||
|
{
|
|||
|
g = Image_G_pixel(src, x+d[foo].x, y+d[foo].y);
|
|||
|
if (g > top) top = g;
|
|||
|
}
|
|||
|
g = Image_G_pixel(src, x, y);
|
|||
|
if (g > top) gm = 255;
|
|||
|
else gm = 0;
|
|||
|
|
|||
|
top = 0;
|
|||
|
for (foo=0; foo<8; foo++)
|
|||
|
{
|
|||
|
b = Image_B_pixel(src, x+d[foo].x, y+d[foo].y);
|
|||
|
if (b > top) top = b;
|
|||
|
}
|
|||
|
b = Image_B_pixel(src, x, y);
|
|||
|
if (b > top) bm = 255;
|
|||
|
else bm = 0;
|
|||
|
|
|||
|
Image_plotRGB(dst, x, y, rm, gm, bm);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#if DEBUG_LEVEL
|
|||
|
fprintf(stderr, "\tok?\n");
|
|||
|
#endif
|
|||
|
|
|||
|
return OLL_KORRECT;
|
|||
|
}
|
|||
|
/*::------------------------------------------------------------------::*/
|
|||
|
/*
|
|||
|
* on cherche les endroits ou le niveau de gris est 'plat'.
|
|||
|
*
|
|||
|
* le param<EFBFBD>tre 'r1' n'est pas utilise et doit etre mis <EFBFBD> 0
|
|||
|
*/
|
|||
|
int
|
|||
|
Image_detect_flat_gray(Image_Desc *src, Image_Desc *dst, int param, int r1)
|
|||
|
{
|
|||
|
int x, y, foo, r, g, b, gris, mini, maxi;
|
|||
|
static struct
|
|||
|
{
|
|||
|
int x, y;
|
|||
|
} d[] =
|
|||
|
{
|
|||
|
{ -1, -1 },
|
|||
|
{ 0, -1 },
|
|||
|
{ 1, -1 },
|
|||
|
{ -1, 0 },
|
|||
|
{ 1, 0 },
|
|||
|
{ -1, 1 },
|
|||
|
{ 0, 1 },
|
|||
|
{ 1, 1 }
|
|||
|
};
|
|||
|
|
|||
|
if ( (foo=Image_compare_desc(src, dst)) )
|
|||
|
{
|
|||
|
fprintf(stderr, "Detect Flat Gray: erreur: %s\n", Image_err2str(foo));
|
|||
|
return foo;
|
|||
|
}
|
|||
|
|
|||
|
if (0 != r1)
|
|||
|
{
|
|||
|
fprintf(stderr, "%s : ah ah r1 is %d, a bad value\n", __func__, r1);
|
|||
|
}
|
|||
|
|
|||
|
for (y=1; y<src->height-1; y++)
|
|||
|
{
|
|||
|
for (x=1; x<src->width-1; x++)
|
|||
|
{
|
|||
|
mini = 999999;
|
|||
|
maxi = -42;
|
|||
|
for (foo=0; foo<8; foo++)
|
|||
|
{
|
|||
|
Image_getRGB(src, x+d[foo].x, y+d[foo].y, &r, &g, &b);
|
|||
|
gris = r + g + b;
|
|||
|
if (gris > maxi) maxi = gris;
|
|||
|
else if (gris < mini) mini = gris;
|
|||
|
}
|
|||
|
if (maxi-mini < param)
|
|||
|
Image_plotRGB(dst, x, y, 255, 255, 255);
|
|||
|
else
|
|||
|
Image_plotRGB(dst, x, y, 0, 0, 0);
|
|||
|
}
|
|||
|
}
|
|||
|
/*
|
|||
|
* hop, en finale, on efface les bords, et on
|
|||
|
* marque l'image "modifi<EFBFBD>e".
|
|||
|
*/
|
|||
|
(void)Image_raz_sides(dst);
|
|||
|
dst->modified = 1;
|
|||
|
|
|||
|
return FUNC_IS_ALPHA;
|
|||
|
}
|
|||
|
/*::------------------------------------------------------------------::*/
|
|||
|
|