DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ T c

⟦0c0dfca3d⟧ TextFile

    Length: 2977 (0xba1)
    Types: TextFile
    Names: »correlate.c++«

Derivation

└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
    └─ ⟦this⟧ »EUUGD11/euug-87hel/sec1/image/vartools/correlate.c++« 

TextFile

/*
    This is the source file for correlation routines
*/

#include <stream.h>
#include <stdio.h>
#include <string.h>
#include <for.h++>
#include <double_image.h++>
#include "vartools.h++"

// this routine correlates the image at a point
double
do_correlate(double_image& template, double_image& input)
    {
    // total sums up the correlation
    double total = 0.;

    // iterate through the template
    FOR(int i1 = 0 ; i1 < template.n_rows() ; i1++)
	{
	FOR(int i2 = 0 ; i2 < template.n_cols() ; i2++)
	    {
	    total += template.get_w_e(i1,i2)*input.get_w_e(i1,i2);
	    }
	ENDFOR
	}
    ENDFOR

    return total;
    }

// this one takes 2 images and returns an image containing the correlation
double_image&
correlate2(double_image& template, double_image& input, FILE *output_file)
    {
    // check that the template is smaller than the input
    if 
	( 
	(template.n_rows() > input.n_rows()) 
	|| 
	(template.n_cols() > input.n_cols()) 
	)
	{
	cerr << form
	    (
	    "Template[%d,%d] is larger than image[%d,%d]!\n",
	    template.n_rows(),
	    template.n_cols(),
	    input.n_rows(),
	    input.n_cols(),
	    );
	abort();
	}
    // the output will only have points of the input that
    // can be completely calculated (template does not fall off edge)
    double_image *output_pointer = new double_image
	(
	CREATE,
	input.n_rows() - template.n_rows() + 1,
	input.n_cols() - template.n_cols() + 1,
	output_file
	);
    double_image& output = *output_pointer;
    
    // make sure the window size is the same as the template size
    // for the input
    input.resize_window(template.n_cols(),template.n_rows());

    // make the entire template random accessable
    template.window_entire_image();

    // iterate through image correlating
    while(++input,++output)
	{
	output() = do_correlate(template,input);
	}
    
    // return the output image
    return output;
    }

// this one takes 3 file pointers
void
correlate(FILE *template_file, FILE *input_file, FILE *output_file, char *comment)
    {
    // read in the template and input file
    double_image template(READ,template_file);
    double_image input(READ,input_file);

    // do the correlation
    double_image& output = correlate2(template,input,output_file);

    // construct the comments
    output.set_comments(comment,strlen(comment));
    output.add_comment("Engaged in correlation, template is:\n",strlen("Engaged in correlation, template is:\n"));
    output.add_comment((char *) template.the_comments(), template.c_length());
    output.add_comment("\nImage is:\n",strlen("\nImage is:\n"));
    output.add_comment((char *) input.the_comments(), input.c_length());

    // write the image to file
    output.write();
    }
/*
Copyright (C) 1986, David Sher in the University of Rochester
Permission is granted to any individual or institution to use, copy, or
redistribute this software so long as it is not sold for profit, provided
this copyright notice is retained.
*/