Bibliothèque de traitements d'images en virgule flottante.
http://la.buvette.org/photos/cumul/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
2.9 KiB
135 lines
2.9 KiB
/* |
|
* fimg-core.c |
|
* |
|
* |
|
*/ |
|
|
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <unistd.h> |
|
#include <string.h> |
|
#include <math.h> |
|
|
|
#include "../floatimg.h" |
|
|
|
extern int verbosity; /* must be declared around main() */ |
|
|
|
/* ---------------------------------------------------------------- */ |
|
float fimg_get_maxvalue(FloatImg *head) |
|
{ |
|
float maxval; |
|
int foo; |
|
|
|
if (head->type != FIMG_TYPE_RGB && head->type != FIMG_TYPE_GRAY) { |
|
fprintf(stderr, "%s : type %d invalide\n", |
|
__func__, head->type); |
|
return nanf("wtf ?"); |
|
} |
|
|
|
maxval = 0.0; /* no negative values allowed */ |
|
|
|
switch (head->type) { |
|
case FIMG_TYPE_RGB: |
|
for (foo=0; foo<(head->width*head->height); foo++) { |
|
if (head->R[foo] > maxval) maxval = head->R[foo]; |
|
if (head->G[foo] > maxval) maxval = head->G[foo]; |
|
if (head->B[foo] > maxval) maxval = head->B[foo]; |
|
} |
|
case FIMG_TYPE_GRAY: |
|
for (foo=0; foo<(head->width*head->height); foo++) { |
|
if (head->R[foo] > maxval) maxval = head->R[foo]; |
|
} |
|
} |
|
|
|
return maxval; |
|
} |
|
/* ---------------------------------------------------------------- */ |
|
int fimg_meanvalues(FloatImg *head, float means[4]) |
|
{ |
|
int idx, surface; |
|
|
|
surface = head->width * head->height; |
|
if (surface < 1) return -1; |
|
|
|
memset(means, 0, 4*sizeof(float)); |
|
|
|
for (idx=0; idx<surface; idx++) { |
|
means[0] += head->R[idx]; |
|
if (head->type > 2) { |
|
means[1] += head->G[idx]; |
|
means[2] += head->B[idx]; |
|
} |
|
} |
|
|
|
for (idx=0; idx<4; idx++) means[idx] /= (float)surface; |
|
|
|
return 0; |
|
} |
|
/* ---------------------------------------------------------------- */ |
|
/* |
|
* more elaborate functions are in fimg-2gray.c |
|
*/ |
|
int fimg_to_gray(FloatImg *head) |
|
{ |
|
float add; |
|
int foo; |
|
|
|
if (head->type != FIMG_TYPE_RGB) { |
|
fprintf(stderr, "%s : type %d invalide\n", |
|
__func__, head->type); |
|
return -3; |
|
} |
|
|
|
for (foo=0; foo<(head->width*head->height); foo++) { |
|
add = head->R[foo]; |
|
add += head->G[foo]; |
|
add += head->B[foo]; |
|
head->R[foo] = head->G[foo] = head->B[foo] = add; |
|
} |
|
return -1; |
|
} |
|
/* ---------------------------------------------------------------- */ |
|
void fimg_add_cste(FloatImg *fi, float value) |
|
{ |
|
int nbre, idx; |
|
|
|
if (fi->type != FIMG_TYPE_RGB) { |
|
fprintf(stderr, "%s : type %d invalide\n", |
|
__func__, fi->type); |
|
return; |
|
} |
|
|
|
nbre = fi->width * fi->height * fi->type; |
|
#if DEBUG_LEVEL |
|
fprintf(stderr, "%s, nbre is %d\n", __func__, nbre); |
|
#endif |
|
for (idx=0; idx<nbre; nbre++) { |
|
fi->R[idx] += value; |
|
} |
|
} |
|
/* ---------------------------------------------------------------- */ |
|
/* Warning: this function is _very_ slow */ |
|
void fimg_drand48(FloatImg *fi, float kmul) |
|
{ |
|
int nbre, idx; |
|
|
|
#if DEBUG_LEVEL |
|
fprintf(stderr, ">>> %s ( %p %g )\n", __func__, fi, kmul); |
|
#endif |
|
|
|
if (fi->type != FIMG_TYPE_RGB) { |
|
fprintf(stderr, "%s : type %d invalide\n", |
|
__func__, fi->type); |
|
return; |
|
} |
|
nbre = fi->width * fi->height; |
|
for (idx=0; idx<nbre; idx++) { |
|
fi->R[idx] = drand48() * kmul; |
|
fi->G[idx] = drand48() * kmul; |
|
fi->B[idx] = drand48() * kmul; |
|
} |
|
|
|
} |
|
/* ---------------------------------------------------------------- */ |
|
|
|
|
|
|