185 lines
3.7 KiB
C
185 lines
3.7 KiB
C
/*
|
|
* contrast.c - part of libfloatimg
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <string.h>
|
|
#include <math.h>
|
|
|
|
#include "../floatimg.h"
|
|
|
|
extern int verbosity;
|
|
|
|
/* ---------------------------------------------------------------- */
|
|
int fimg_id_contraste(char *str)
|
|
{
|
|
|
|
if (!strcmp(str, "none")) return CONTRAST_NONE;
|
|
if (!strcmp(str, "sqrt")) return CONTRAST_SQRT;
|
|
if (!strcmp(str, "pow2")) return CONTRAST_POW2;
|
|
if (!strcmp(str, "cos01")) return CONTRAST_COS01;
|
|
if (!strcmp(str, "cos010")) return CONTRAST_COS010;
|
|
|
|
return -1;
|
|
}
|
|
/* ---------------------------------------------------------------- */
|
|
/*
|
|
* if the second parameter is NULL, operate 'in-place'
|
|
*/
|
|
int fimg_square_root(FloatImg *s, FloatImg *d, double maxval)
|
|
{
|
|
int nbre, idx;
|
|
double dval;
|
|
|
|
if (s->type != FIMG_TYPE_RGB) {
|
|
fprintf(stderr, "%s : type %d invalide\n",
|
|
__func__, s->type);
|
|
return -4;
|
|
}
|
|
|
|
if (NULL==d) {
|
|
d = s;
|
|
}
|
|
else {
|
|
if (d->type != FIMG_TYPE_RGB) {
|
|
fprintf(stderr, "%s : dst type %d invalide\n",
|
|
__func__, d->type);
|
|
return -4;
|
|
}
|
|
}
|
|
|
|
|
|
nbre = s->width * s->height;
|
|
|
|
for (idx=0; idx<nbre; idx++) {
|
|
dval = s->R[idx] / maxval;
|
|
d->R[idx] = maxval * sqrt(dval);
|
|
dval = s->G[idx] / maxval;
|
|
d->G[idx] = maxval * sqrt(dval);
|
|
dval = s->B[idx] / maxval;
|
|
d->B[idx] = maxval * sqrt(dval);
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
/* ---------------------------------------------------------------- */
|
|
int fimg_power_2(FloatImg *s, FloatImg *d, double maxval)
|
|
{
|
|
int nbre, idx;
|
|
double dval;
|
|
|
|
if (s->type != FIMG_TYPE_RGB) {
|
|
fprintf(stderr, "%s: src type %d invalide\n",
|
|
__func__, s->type);
|
|
return -4;
|
|
}
|
|
|
|
if (NULL==d) {
|
|
d = s;
|
|
}
|
|
else {
|
|
if (d->type != FIMG_TYPE_RGB) {
|
|
fprintf(stderr, "%s: dst type %d invalide\n",
|
|
__func__, d->type);
|
|
return -4;
|
|
}
|
|
}
|
|
|
|
|
|
nbre = s->width * s->height;
|
|
|
|
for (idx=0; idx<nbre; idx++) {
|
|
dval = s->R[idx] / maxval;
|
|
d->R[idx] = maxval * dval * dval;
|
|
dval = s->G[idx] / maxval;
|
|
d->G[idx] = maxval * dval * dval;
|
|
dval = s->B[idx] / maxval;
|
|
d->B[idx] = maxval * dval * dval;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* ---------------------------------------------------------------- */
|
|
/*
|
|
#macro Cos_01( X )
|
|
(0.5-0.5*cos( 3.141592654 * X))
|
|
#end
|
|
*/
|
|
int fimg_cos_01(FloatImg *s, FloatImg *d, double maxval)
|
|
{
|
|
int nbre, idx;
|
|
double dval;
|
|
|
|
if (s->type != FIMG_TYPE_RGB) {
|
|
fprintf(stderr, "%s : type %d invalide\n",
|
|
__func__, s->type);
|
|
return -4;
|
|
}
|
|
|
|
if (NULL==d) {
|
|
d = s;
|
|
}
|
|
else {
|
|
if (d->type != FIMG_TYPE_RGB) {
|
|
fprintf(stderr, "%s : dst type %d invalide\n",
|
|
__func__, d->type);
|
|
return -4;
|
|
}
|
|
}
|
|
|
|
nbre = s->width * s->height;
|
|
|
|
for (idx=0; idx<nbre; idx++) {
|
|
dval = s->R[idx] / maxval;
|
|
d->R[idx] = maxval * (0.5 - 0.5 * cos(3.141592654*dval));
|
|
dval = s->G[idx] / maxval;
|
|
d->G[idx] = maxval * (0.5 - 0.5 * cos(3.141592654*dval));
|
|
dval = s->B[idx] / maxval;
|
|
d->B[idx] = maxval * (0.5 - 0.5 * cos(3.141592654*dval));
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
/* ---------------------------------------------------------------- */
|
|
int fimg_cos_010(FloatImg *s, FloatImg *d, double maxval)
|
|
{
|
|
int nbre, idx;
|
|
double dval;
|
|
|
|
if (s->type != FIMG_TYPE_RGB) {
|
|
fprintf(stderr, "%s : type %d invalide\n",
|
|
__func__, s->type);
|
|
return -4;
|
|
}
|
|
|
|
if (NULL==d) {
|
|
d = s;
|
|
}
|
|
else {
|
|
if (d->type != FIMG_TYPE_RGB) {
|
|
fprintf(stderr, "%s : dst type %d invalide\n",
|
|
__func__, d->type);
|
|
return -4;
|
|
}
|
|
}
|
|
|
|
nbre = s->width * s->height;
|
|
|
|
for (idx=0; idx<nbre; idx++) {
|
|
dval = s->R[idx] / maxval;
|
|
d->R[idx] = maxval * (0.5 - 0.5 * cos(2*3.141592654*dval));
|
|
dval = s->G[idx] / maxval;
|
|
d->G[idx] = maxval * (0.5 - 0.5 * cos(2*3.141592654*dval));
|
|
dval = s->B[idx] / maxval;
|
|
d->B[idx] = maxval * (0.5 - 0.5 * cos(2*3.141592654*dval));
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* ---------------------------------------------------------------- */
|
|
|