void demosaicChromaSuppressed()

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);
        }
      }
    }
  }