Пример #1
0
static PyObject*
_curve_apply(PyObject *self, PyObject *args)
{
    char *image_mode;
    PyObject *buffer = NULL, *curve_a = NULL, *curve_r = NULL, *curve_g = NULL, *curve_b = NULL;

    if (!PyArg_ParseTuple(args, "sOOOOO:apply", &image_mode, &buffer, &curve_a, &curve_r, &curve_g, &curve_b)) {
        return NULL;
    }

    unsigned char *points_a = cubic_spline_interpolation(get_curve(curve_a), PyTuple_Size(curve_a), 256),
                  *points_r = cubic_spline_interpolation(get_curve(curve_r), PyTuple_Size(curve_r), 256),
                  *points_g = cubic_spline_interpolation(get_curve(curve_g), PyTuple_Size(curve_g), 256),
                  *points_b = cubic_spline_interpolation(get_curve(curve_b), PyTuple_Size(curve_b), 256);

    Py_ssize_t size = PyString_Size(buffer);
    unsigned char *ptr = (unsigned char *) PyString_AsString(buffer);
    int num_bytes = bytes_per_pixel(image_mode);

    int r_idx = rgb_order(image_mode, 'R'),
        g_idx = rgb_order(image_mode, 'G'),
        b_idx = rgb_order(image_mode, 'B'),
        i = 0, r, g, b;

    size -= num_bytes;

    for (; i <= size; i += num_bytes) {
        r = ptr[i + r_idx];
        g = ptr[i + g_idx];
        b = ptr[i + b_idx];

        r = points_r[r];
        g = points_g[g];
        b = points_b[b];

        r = points_a[r];
        g = points_a[g];
        b = points_a[b];

        ptr[i + r_idx] = ADJUST_COLOR(r);
        ptr[i + g_idx] = ADJUST_COLOR(g);
        ptr[i + b_idx] = ADJUST_COLOR(b);
    }

    free(points_a);
    free(points_r);
    free(points_g);
    free(points_b);

    Py_INCREF(buffer);
    return buffer;
}
Пример #2
0
void
aipImageInterpolation(interpolation_t method,
		      float 	*data,
		      int 	npf,
		      int	npm,
		      float 	*cdata,
		      int 	cnpf,
		      int	cnpm )
{
    /*
     *	Memory allocation
     */
    float *buf = new float[npm];
    float *cbuf = new float[cnpm];
    float *buf2D = new float[npf*cnpm];
    /*
     *	Interpolation along "medium" axis
     */
    int	i, j;

    for( j=0; j<npf; j++ ){
	for( i=0; i<npm; i++ ){
	    buf[i] = data[ i*npf + j ];
	} 
	
	if( method == INTERP_CUBIC_SPLINE ) {
	    cubic_spline_interpolation( npm, buf, cnpm, cbuf ); 
	} else {
	    simple_interpolation( npm, buf, cnpm, cbuf );
	}
	
	for( i=0; i<cnpm; i++ ){
	    buf2D[i*npf+j] = cbuf[i];
	}
    }
    /*
     *	Interpolation along "fast" axis
     */
    for( j=0; j<cnpm; j++ ){
	if( method == INTERP_CUBIC_SPLINE ) {
	    cubic_spline_interpolation(npf, &buf2D[j*npf],
				       cnpf, &cdata[j*cnpf]);
	}else{
	    simple_interpolation(npf, &buf2D[j*npf],
				 cnpf, &cdata[j*cnpf]);
	}
    }
    
    delete [] buf;
    delete [] cbuf;
    delete [] buf2D;
}
Пример #3
0
int main(int argc, char *argv[]) {
    int nd = atoi(argv[1]);
    int nx = atoi(argv[2]);

    double *xd, *yd, *x, *y;

    xd = (double *)malloc(sizeof(double)*nd);
    yd = (double *)malloc(sizeof(double)*nd);
    x = (double *)malloc(sizeof(double)*nx);
    y = (double *)malloc(sizeof(double)*nx);

    FILE *f;
    int i;
    f = fopen("data.dat","r");
    for(i=0;i<nd;i++) {
        fscanf(f,"%lg\t%lg\n",&xd[i],&yd[i]);

    }
    fclose(f);

    f = fopen("xvals.dat","r");
    for(i=0;i<nx;i++) {
        fscanf(f,"%lg\n",&x[i]);

    }
    fclose(f);

    printf("Testing linear interpolation...\n");
    linear_interpolation(x,y,xd,yd,nx,nd);

    f = fopen("yvals_lint.dat","w");
    for(i=0;i<nx;i++) {
        fprintf(f,"%.16lg\n",y[i]);
    }
    fclose(f);

    for(i=0;i<nx;i++) y[i] = 0;

    printf("Testing cubic spline interpolation...\n");

    cubic_spline_interpolation(x,y,xd,yd,nx,nd);

    printf("Outputting cubic spline interpolation...\n");
    f = fopen("yvals_splint.dat","w");
    for(i=0;i<nx;i++) {
        fprintf(f,"%.16lg\n",y[i]);
    }
    fclose(f);
    
    return 0;

}
Пример #4
0
/*==============================================================

    Image ( 2D data ) interpolation
	data: input data
	npf: data size at fast dimension of input data
	npm: data size at medium dimension of input data

	cdata: output data
	cnpf: data size at fast dimension of output data
	cnpm: data size at medium dimension of output data

	method: SIMPLE or CUBIC_SPLINE
	minus:  PASSASMINUS or CONV2ZERO

	RETURN value is always OK(!)

===============================================================*/
int
image_2D_interpolation( Interpolation_method	method,
			Minusval_type	minus,
			float 	*data,
			int 	npf,
			int	npm,
			float 	*cdata,
			int 	cnpf,
			int	cnpm )
{
    /*
     *	Memory allocation
     */
    float *buf = new float[npm];
    float *cbuf = new float[cnpm];
    float *buf2D = new float[npf*cnpm];
    /*
     *	Interpolation along "medium" axis
     */
    int	i, j;

    for( j=0; j<npf; j++ ){
	for( i=0; i<npm; i++ ){
	    buf[i] = data[ i*npf + j ];
	} 
	
	if( method == CUBIC_SPLINE ) {
	    cubic_spline_interpolation( npm, buf, cnpm, cbuf ); 
	}else{
	    simple_interpolation( npm, buf, cnpm, cbuf );
	}
	
	if( minus == CONV2ZERO ){
	    for( i=0; i<cnpm; i++ ){
		if( cbuf[i] < 0 )
		    buf2D[i*npf+j] = 0;
		else
		    buf2D[i*npf+j] = cbuf[i];
	    }
	}else{
	    for( i=0; i<cnpm; i++ ){
	        buf2D[i*npf+j] = cbuf[i];
	    }
	}
    }
    /*
     *	Interpolation along "fast" axis
     */
    for( j=0; j<cnpm; j++ ){
	if( method == CUBIC_SPLINE ) {
	    cubic_spline_interpolation(npf, &buf2D[j*npf],
				       cnpf, &cdata[j*cnpf]);
	}else{
	    simple_interpolation(npf, &buf2D[j*npf],
				 cnpf, &cdata[j*cnpf]);
	}
	
	if( minus == CONV2ZERO ){
	    for( i=0; i<cnpf; i++ ){
		if( cdata[i+j*cnpf] < 0 )
		cdata[i+j*cnpf] = 0;
	    }
	}
    }
    
    delete [] buf;
    delete [] cbuf;
    delete [] buf2D;

    return OK;
}