2019-11-15 16:07:06 +11:00
|
|
|
/*
|
|
|
|
* contrast.c - part of libfloatimg
|
2021-05-18 07:38:56 +11:00
|
|
|
* --------------------------------
|
|
|
|
*
|
|
|
|
* you can see some use in 'tools/fimgfx.c', so you can thing
|
|
|
|
* about the 'maxval' parameter. C'est touchy :)
|
2019-11-15 16:07:06 +11:00
|
|
|
*/
|
|
|
|
|
2019-11-12 10:20:28 +11:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <math.h>
|
|
|
|
|
|
|
|
#include "../floatimg.h"
|
|
|
|
|
|
|
|
extern int verbosity;
|
|
|
|
|
|
|
|
/* ---------------------------------------------------------------- */
|
2019-11-18 20:18:30 +11:00
|
|
|
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;
|
2019-12-04 21:17:45 +11:00
|
|
|
if (!strcmp(str, "cos010")) return CONTRAST_COS010;
|
2019-11-18 20:18:30 +11:00
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
/* ---------------------------------------------------------------- */
|
2019-11-15 16:07:06 +11:00
|
|
|
/*
|
|
|
|
* if the second parameter is NULL, operate 'in-place'
|
|
|
|
*/
|
2019-11-12 10:20:28 +11:00
|
|
|
int fimg_square_root(FloatImg *s, FloatImg *d, double maxval)
|
|
|
|
{
|
|
|
|
int nbre, idx;
|
|
|
|
double dval;
|
|
|
|
|
|
|
|
if (s->type != FIMG_TYPE_RGB) {
|
2021-05-18 07:38:56 +11:00
|
|
|
fprintf(stderr, "%s: type %d invalide\n",
|
2019-11-12 10:20:28 +11:00
|
|
|
__func__, s->type);
|
|
|
|
return -4;
|
|
|
|
}
|
|
|
|
|
2021-03-18 04:32:51 +11:00
|
|
|
if (NULL==d) { d = s; }
|
2019-11-15 16:07:06 +11:00
|
|
|
else {
|
|
|
|
if (d->type != FIMG_TYPE_RGB) {
|
2021-05-18 07:38:56 +11:00
|
|
|
fprintf(stderr, "%s: dst type %d invalide\n",
|
2019-11-15 16:07:06 +11:00
|
|
|
__func__, d->type);
|
|
|
|
return -4;
|
|
|
|
}
|
|
|
|
}
|
2019-11-12 10:20:28 +11:00
|
|
|
|
2021-03-09 21:55:48 +11:00
|
|
|
nbre = s->width * s->height;
|
2019-11-12 10:20:28 +11:00
|
|
|
|
|
|
|
for (idx=0; idx<nbre; idx++) {
|
|
|
|
dval = s->R[idx] / maxval;
|
|
|
|
d->R[idx] = maxval * sqrt(dval);
|
2021-03-09 21:55:48 +11:00
|
|
|
dval = s->G[idx] / maxval;
|
|
|
|
d->G[idx] = maxval * sqrt(dval);
|
|
|
|
dval = s->B[idx] / maxval;
|
|
|
|
d->B[idx] = maxval * sqrt(dval);
|
2019-11-12 10:20:28 +11:00
|
|
|
}
|
|
|
|
|
2021-05-09 06:48:29 +11:00
|
|
|
return 0;
|
2019-11-12 10:20:28 +11:00
|
|
|
}
|
|
|
|
/* ---------------------------------------------------------------- */
|
|
|
|
int fimg_power_2(FloatImg *s, FloatImg *d, double maxval)
|
|
|
|
{
|
|
|
|
int nbre, idx;
|
|
|
|
double dval;
|
|
|
|
|
|
|
|
if (s->type != FIMG_TYPE_RGB) {
|
2021-03-09 21:55:48 +11:00
|
|
|
fprintf(stderr, "%s: src type %d invalide\n",
|
2019-11-12 10:20:28 +11:00
|
|
|
__func__, s->type);
|
|
|
|
return -4;
|
|
|
|
}
|
|
|
|
|
2021-03-18 04:32:51 +11:00
|
|
|
if (NULL==d) { d = s; }
|
2019-11-15 00:23:12 +11:00
|
|
|
else {
|
|
|
|
if (d->type != FIMG_TYPE_RGB) {
|
2021-03-09 21:55:48 +11:00
|
|
|
fprintf(stderr, "%s: dst type %d invalide\n",
|
2019-11-15 16:07:06 +11:00
|
|
|
__func__, d->type);
|
2019-11-15 00:23:12 +11:00
|
|
|
return -4;
|
|
|
|
}
|
|
|
|
}
|
2019-11-12 10:20:28 +11:00
|
|
|
|
2021-03-09 21:55:48 +11:00
|
|
|
nbre = s->width * s->height;
|
2019-11-12 10:20:28 +11:00
|
|
|
|
|
|
|
for (idx=0; idx<nbre; idx++) {
|
|
|
|
dval = s->R[idx] / maxval;
|
|
|
|
d->R[idx] = maxval * dval * dval;
|
2021-03-09 21:55:48 +11:00
|
|
|
dval = s->G[idx] / maxval;
|
|
|
|
d->G[idx] = maxval * dval * dval;
|
|
|
|
dval = s->B[idx] / maxval;
|
|
|
|
d->B[idx] = maxval * dval * dval;
|
2019-11-12 10:20:28 +11:00
|
|
|
}
|
|
|
|
|
2019-11-15 00:23:12 +11:00
|
|
|
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) {
|
2021-05-18 07:38:56 +11:00
|
|
|
fprintf(stderr, "%s: type %d invalide\n",
|
2019-11-15 00:23:12 +11:00
|
|
|
__func__, s->type);
|
|
|
|
return -4;
|
|
|
|
}
|
|
|
|
|
2021-03-18 04:32:51 +11:00
|
|
|
if (NULL==d) { d = s; }
|
2019-11-15 16:07:06 +11:00
|
|
|
else {
|
|
|
|
if (d->type != FIMG_TYPE_RGB) {
|
2021-05-18 07:38:56 +11:00
|
|
|
fprintf(stderr, "%s: dst type %d invalide\n",
|
2019-11-15 16:07:06 +11:00
|
|
|
__func__, d->type);
|
|
|
|
return -4;
|
|
|
|
}
|
|
|
|
}
|
2019-11-15 00:23:12 +11:00
|
|
|
|
2021-03-09 21:55:48 +11:00
|
|
|
nbre = s->width * s->height;
|
2019-11-15 00:23:12 +11:00
|
|
|
|
|
|
|
for (idx=0; idx<nbre; idx++) {
|
|
|
|
dval = s->R[idx] / maxval;
|
|
|
|
d->R[idx] = maxval * (0.5 - 0.5 * cos(3.141592654*dval));
|
2021-03-09 21:55:48 +11:00
|
|
|
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));
|
2019-11-15 00:23:12 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
2019-11-12 10:20:28 +11:00
|
|
|
}
|
2019-11-15 00:23:12 +11:00
|
|
|
/* ---------------------------------------------------------------- */
|
2019-12-04 00:25:30 +11:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2021-03-18 04:32:51 +11:00
|
|
|
if (NULL==d) { d = s; }
|
2019-12-04 00:25:30 +11:00
|
|
|
else {
|
|
|
|
if (d->type != FIMG_TYPE_RGB) {
|
|
|
|
fprintf(stderr, "%s : dst type %d invalide\n",
|
|
|
|
__func__, d->type);
|
|
|
|
return -4;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-03-09 21:55:48 +11:00
|
|
|
nbre = s->width * s->height;
|
2019-12-04 00:25:30 +11:00
|
|
|
|
|
|
|
for (idx=0; idx<nbre; idx++) {
|
|
|
|
dval = s->R[idx] / maxval;
|
|
|
|
d->R[idx] = maxval * (0.5 - 0.5 * cos(2*3.141592654*dval));
|
2021-03-09 21:55:48 +11:00
|
|
|
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));
|
2019-12-04 00:25:30 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2019-11-12 10:20:28 +11:00
|
|
|
|
|
|
|
/* ---------------------------------------------------------------- */
|
2019-11-15 00:23:12 +11:00
|
|
|
|