libtthimage/Lib/morpho.c

160 lines
3.5 KiB
C
Raw Blame History

/*
morpho.c
---------------
*/
#include <stdio.h>
#include "../tthimage.h"
/*::------------------------------------------------------------------::*/
static struct
{
int x, y;
} deltas[] =
{ { -1, -1, },
{ 0, -1, },
{ 1, -1, },
{ -1, 0, },
{ 0, 0, },
{ 1, 0, },
{ -1, 1, },
{ 0, 1, },
{ 1, 1 }
};
/*::------------------------------------------------------------------::*/
/*
* n'est-ce pas une dilatation ?
* =============================
* 23 avril 2007: switched to direct pixel access.
*/
int Image_expand_max(Image_Desc *src, Image_Desc *dst, int factor)
{
int foo, x, y, maxr, maxg, maxb;
int r, g, b;
if ( (foo=Image_compare_desc(src, dst)) ) {
fprintf(stderr, "%s: images non compatibles\n", __func__);
return foo;
}
if ( 0 != factor ) {
fprintf(stderr, "%s: factor (%d) must be 0\n", __func__, factor);
}
for (y=1; y<src->height-1; y++) {
for (x=1; x<src->width-1; x++) {
maxr = maxg = maxb = 0;
for (foo=0; foo<9; foo++) {
/* XXX Faster pussy cat !
Image_getRGB(src, x+deltas[foo].x, y+deltas[foo].y,
&r, &g, &b);
*/
r = src->Rpix[y+deltas[foo].y][x+deltas[foo].x];
g = src->Gpix[y+deltas[foo].y][x+deltas[foo].x];
b = src->Bpix[y+deltas[foo].y][x+deltas[foo].x];
if (maxr < r) maxr = r;
if (maxg < g) maxg = g;
if (maxb < b) maxb = b;
}
/* XXX Kill Kill !y cat !
Image_plotRGB(dst, x, y, maxr, maxg, maxb);
*/
dst->Rpix[y][x] = maxr;
dst->Gpix[y][x] = maxg;
dst->Bpix[y][x] = maxb;
}
}
dst->modified = 1;
return 0;
}
/*::------------------------------------------------------------------::*/
int Image_expand_min(Image_Desc *src, Image_Desc *dst, int factor)
{
int foo, x, y, minr, ming, minb;
int r, g, b;
if ( (foo=Image_compare_desc(src, dst)) ) {
return foo;
}
if ( 0 != factor ) {
fprintf(stderr, "%s: factor (%d) must be 0\n", __func__, factor);
}
#if DEBUG_LEVEL
fprintf(stderr, "expanding MIN %p to %p\n", src, dst);
#endif
for (y=1; y<src->height-1; y++) {
for (x=1; x<src->width-1; x++) {
minr = ming = minb = 1664;
for (foo=0; foo<9; foo++) {
Image_getRGB(src, x+deltas[foo].x, y+deltas[foo].y,
&r, &g, &b);
if (minr > r) minr = r;
if (ming > g) ming = g;
if (minb > b) minb = b;
}
Image_plotRGB(dst, x, y, minr, ming, minb);
}
}
dst->modified = 1;
return 0;
}
/*::------------------------------------------------------------------::*/
struct sort_pixel
{
int r, g, b;
int gris;
int rang;
};
static void
Image_sortmat_display(FILE *ou, struct sort_pixel *table)
{
fprintf(ou, "%s ( %p )\n", __func__, table);
}
int Image_Gray_Sorted_Points(Image_Desc *src, Image_Desc *dst, int *filtre)
{
int x, y, r, g, b;
int foo, gris;
struct sort_pixel pixels[9];
#if DEBUG_LEVEL
fprintf(stderr, "Image Gray Sorted Points: %p -> %p\n", src, dst);
#endif
for (y=1; y<src->height-1; y++) {
for (x=1; x<src->width-1; x++) {
/* collecte des infos sur les voisins. */
for (foo=0; foo<9; foo++) {
Image_getRGB(src, x+deltas[foo].x, y+deltas[foo].y,
&r, &g, &b);
pixels[foo].r = r;
pixels[foo].g = g;
pixels[foo].b = b;
pixels[foo].gris = r + g + b;
pixels[foo].rang = foo;
}
/* tri des informations collect<63>es. */
gris = 0;
/* application des coeficients */
}
}
fprintf(stderr, "**** Ha %p Ha this function is _not_ written ****\n", dst);
return FUNC_NOT_FINISH;
}
/*::------------------------------------------------------------------::*/
/*::------------------------------------------------------------------::*/