in source/isp/CameraIsp.h [249:319]
void demosaicChromaSuppressed(cv::Mat_<float>& red, cv::Mat_<float>& green, cv::Mat_<float>& blue)
const {
// compute r-b
cv::Mat_<float> redMinusGreen(height, width);
cv::Mat_<float> blueMinusGreen(height, width);
for (int i = 0; i < height; ++i) {
for (int j = 0; j < width; ++j) {
if (redPixel(i, j)) {
redMinusGreen(i, j) = red(i, j) - green(i, j);
} else if (!greenPixel(i, j)) {
blueMinusGreen(i, j) = blue(i, j) - green(i, j);
}
}
}
// Now use a constant hue based red/blue bilinear interpolation
for (int i = 0; i < height; ++i) {
const int i_1 = math_util::reflect(i - 1, height);
const int i1 = math_util::reflect(i + 1, height);
const int i_2 = math_util::reflect(i - 2, height);
const int i2 = math_util::reflect(i + 2, height);
const bool redGreenRow =
(redPixel(i, 0) && greenPixel(i, 1)) || (redPixel(i, 1) && greenPixel(i, 0));
for (int j = 0; j < width; ++j) {
const int j_1 = math_util::reflect(j - 1, width);
const int j1 = math_util::reflect(j + 1, width);
const int j_2 = math_util::reflect(j - 2, width);
const int j2 = math_util::reflect(j + 2, width);
if (redPixel(i, j)) {
blue(i, j) = (blueMinusGreen(i_1, j_1) + blueMinusGreen(i1, j_1) +
blueMinusGreen(i_1, j1) + blueMinusGreen(i1, j1)) /
4.0f +
green(i, j);
red(i, j) = (redMinusGreen(i, j) + redMinusGreen(i_2, j) + redMinusGreen(i2, j) +
redMinusGreen(i, j_2) + redMinusGreen(i, j2)) /
5.0f +
green(i, j);
} else if (greenPixel(i, j)) {
cv::Mat_<float>& diffCh1 = redGreenRow ? blueMinusGreen : redMinusGreen;
cv::Mat_<float>& diffCh2 = redGreenRow ? redMinusGreen : blueMinusGreen;
cv::Mat_<float>& ch1 = redGreenRow ? blue : red;
cv::Mat_<float>& ch2 = redGreenRow ? red : blue;
ch1(i, j) = (diffCh1(i_1, j_2) + diffCh1(i_1, j) + diffCh1(i_1, j2) + diffCh1(i1, j_2) +
diffCh1(i1, j2) + diffCh1(i1, j2)) /
6.0f +
green(i, j);
ch2(i, j) = (diffCh2(i_2, j_1) + diffCh2(i, j_1) + diffCh2(i2, j_1) + diffCh2(i_2, j1) +
diffCh2(i, j1) + diffCh2(i2, j1)) /
6.0f +
green(i, j);
} else {
red(i, j) = (redMinusGreen(i_1, j_1) + redMinusGreen(i1, j_1) + redMinusGreen(i_1, j1) +
redMinusGreen(i1, j1)) /
4.0f +
green(i, j);
blue(i, j) = (blueMinusGreen(i, j) + blueMinusGreen(i_2, j) + blueMinusGreen(i2, j) +
blueMinusGreen(i, j_2) + blueMinusGreen(i, j2)) /
5.0f +
green(i, j);
}
}
}
}