-
Notifications
You must be signed in to change notification settings - Fork 1
/
covariance.c
105 lines (81 loc) · 1.56 KB
/
covariance.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include "header.h"
#include "proto.h"
void covariance(
int width,
int height,
double *image1,
double *mean1,
double *image2,
double *mean2,
int radius,
double *covar
)
{
double *image_product;
int i;
int j;
int ind;
double *filtered_image;
double *mean_product;
/*
Allocate memory for the product of the 2 images
*/
image_product= (double *)calloc(width*height,sizeof(double));
/*
Compute the product of the 2 images
*/
for ( i= 0 ; i< height ; i++ ) {
for ( j= 0 ; j< width ; j++ ) {
ind= i*width+j;
image_product[ind]= image1[ind]*image2[ind];
}
}
/*
Allocate memory for the filtered image
*/
filtered_image= (double *)calloc(width*height,sizeof(double));
/*
Apply the box filter to the product of the 2 images
*/
box_filter(
width,
height,
image_product,
radius,
filtered_image
);
/*
Allocate memory for the product of the 2 means
*/
mean_product= (double *)calloc(width*height,sizeof(double));
/*
Compute the product of the 2 means
*/
for ( i= 0 ; i< height ; i++ ) {
for ( j= 0 ; j< width ; j++ ) {
ind= i*width+j;
mean_product[ind]= mean1[ind]*mean2[ind];
}
}
/*
Fill in the covariance array
*/
for ( i= 0 ; i< height ; i++ ) {
for ( j= 0 ; j< width ; j++ ) {
ind= i*width+j;
covar[ind]= filtered_image[ind]-mean_product[ind];
}
}
/*
Free memory for the product of the 2 images
*/
free(image_product);
/*
Free memory for the filtered image
*/
free(filtered_image);
/*
Free memory for the product of the 2 means
*/
free(mean_product);
}