-
Notifications
You must be signed in to change notification settings - Fork 1
/
weighted_median.c
104 lines (83 loc) · 1.42 KB
/
weighted_median.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
#include "header.h"
#include "proto.h"
void weighted_median(
int width,
int height,
int *image_arr,
int *disp_arr,
int *occ_arr,
int min_d,
int max_d,
int radius,
double sigma_space,
double sigma_color,
int *new_disp_arr
)
{
int size;
double *hist_arr;
int i;
int j;
int ind;
int occ;
int hist_ind;
/*
Allocate memory for the disparity histogram
*/
size= max_d-min_d+1;
hist_arr= (double *)calloc(size,sizeof(double));
for ( i= 0 ; i< height ; i++ ) {
for ( j= 0 ; j< width ; j++ ) {
ind= i*width+j;
/*
Check if occluded
*/
occ= occ_arr[ind];
if ( occ == 255 ) {
/*
Not occluded
*/
new_disp_arr[ind]= disp_arr[ind];
continue;
}
/*
If here,
pixel is occluded
*/
/*
Smooth the disparity using a bilateral filter
*/
/*
Get disparity histogram
*/
weighted_histo(
width,
height,
image_arr,
disp_arr,
occ_arr,
min_d,
max_d,
radius,
sigma_space,
sigma_color,
i,
j,
hist_arr
);
/*
Get histogram median
*/
hist_ind= median_histo(
min_d,
max_d,
hist_arr
);
new_disp_arr[ind]= min_d+hist_ind;
}
}
/*
Free disparity histogram
*/
free(hist_arr);
}