var n = parseInt((patch_size - 1) / 2);
for (var i = n; i < height - n; i++) {
for (var j = n; j < width - n; j++) {
var min_cost = 99999;
var final_disparity = d_min;
for (var d = d_min; d <= d_max; d++) {
if (j + n + d >= width) {
break;
}
var cost;
var sum1 = 0.0, sum2 = 0.0;
for (var h = i - n; h <= i + n; h++) {
for (var w = j - n; w <= j + n; w++) {
// 忽略中心点?
var delta_g = Math.sqrt(Math.pow((h - i), 2) + Math.pow((w - j), 2));
var delta_c_L = getLabDistance(left[h][w + d], left[i][j + d]);
var delta_c_R = getLabDistance(right[h][w], right[i][j]);
var wL = Math.exp((-delta_g) / 7 - (delta_c_L) / 7); // γp = 7 γc = 7
var wR = Math.exp((-delta_g) / 7 - (delta_c_R) / 7); // γp = 7 γc = 7
var e = Math.abs(left[h][w + d][0] - right[h][w][0])
+ Math.abs(left[h][w + d][1] - right[h][w][1])
+ Math.abs(left[h][w + d][2] - right[h][w][2]);
sum1 += wL * wR * e;
sum2 += wL * wR;
}
}
cost = parseFloat(sum1 / sum2);
if (cost < min_cost) {
min_cost = cost;
final_disparity = d;
}
}
output[i][j] = final_disparity * 3;
}
}