[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/codeplaysoftware/visioncpp/master/examples/bayer_filter.cpp [Back]  [Original]

// This file is part of VisionCPP, a lightweight C++ template library
// for computer vision and image processing.
//
// Copyright (C) 2016 Codeplay Software Limited. All Rights Reserved.
//
// Contact: visioncpp@codeplay.com
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/// \file threhsold.cc
///
///              ---------Example---------
///                    Bayer Filter
///
/// \brief This example implements the Bayer Filter Demosaic Method

// include OpenCV for camera display
#include 

// include VisionCpp
#include 

// \brief functor which converts bayerRGGB to BGR
struct BayerRGGBToBGR {
  template 
  visioncpp::pixel::U8C3 operator()(T bayer) {
    // finding the pattern based on the index
    int _case = 0;
    if (bayer.I_r % 2 == 0 && bayer.I_c % 2 == 0) {
      _case = 1;
    } else if (bayer.I_r % 2 == 0 && bayer.I_c % 2 == 1) {
      _case = 2;
    } else if (bayer.I_r % 2 == 1 && bayer.I_c % 2 == 0) {
      _case = 3;
    } else {
      _case = 4;
    }
    switch (_case) {
      case 1:  // PIXEL R
      {
        // Init RGB variables
        uchar R;
        uchar G;
        uchar B;

        // Get G
        uchar G1 = bayer.at(bayer.I_c, bayer.I_r - 1)[0];
        uchar G2 = bayer.at(bayer.I_c + 1, bayer.I_r)[0];
        uchar G3 = bayer.at(bayer.I_c, bayer.I_r + 1)[0];
        uchar G4 = bayer.at(bayer.I_c - 1, bayer.I_r)[0];

        // Get R
        uchar R1 = bayer.at(bayer.I_c, bayer.I_r - 2)[0];
        uchar R2 = bayer.at(bayer.I_c + 2, bayer.I_r)[0];
        uchar R3 = bayer.at(bayer.I_c, bayer.I_r + 2)[0];
        uchar R4 = bayer.at(bayer.I_c - 2, bayer.I_r)[0];

        // Get B
        uchar B1 = bayer.at(bayer.I_c - 1, bayer.I_r - 1)[0];
        uchar B2 = bayer.at(bayer.I_c + 1, bayer.I_r - 1)[0];
        uchar B3 = bayer.at(bayer.I_c + 1, bayer.I_r + 1)[0];
        uchar B4 = bayer.at(bayer.I_c - 1, bayer.I_r + 1)[0];

        // Assign R
        R = bayer.at(bayer.I_c, bayer.I_r)[0];

        // Assign G
        if (abs(R1 - R3) < abs(R2 - R4)) {
          G = (G1 + G3) / 2;
        } else if (abs(R1 - R3) > abs(R2 - R4)) {
          G = (G2 + G4) / 2;
        } else {
          G = (G1 + G2 + G3 + G4) / 4;
        }

        // Assign B
        B = (B1 + B2 + B3 + B4) / 4;

        // Return BGR
        return visioncpp::pixel::U8C3(B, G, R);
      } break;
      case 2:  // PIXEL G1
      {
        // Init RGB variables
        uchar R;
        uchar G;
        uchar B;

        // Get R
        uchar R1 = bayer.at(bayer.I_c - 1, bayer.I_r)[0];
        uchar R2 = bayer.at(bayer.I_c + 1, bayer.I_r)[0];

        // Get B
        uchar B1 = bayer.at(bayer.I_c, bayer.I_r - 1)[0];
        uchar B2 = bayer.at(bayer.I_c, bayer.I_r + 1)[0];

        // Assign R
        R = (R1 + R2) / 2;

        // Assign G
        G = bayer.at(bayer.I_c, bayer.I_r)[0];

        // Assign B
        B = (B1 + B2) / 2;

        // Return BGR
        return visioncpp::pixel::U8C3(B, G, R);
      } break;
      case 3:  // Pixel G2
      {
        // Init RGB variables
        uchar R;
        uchar G;
        uchar B;

        // Get R
        uchar R1 = bayer.at(bayer.I_c, bayer.I_r - 1)[0];
        uchar R2 = bayer.at(bayer.I_c, bayer.I_r + 1)[0];

        // Get B
        uchar B1 = bayer.at(bayer.I_c - 1, bayer.I_r)[0];
        uchar B2 = bayer.at(bayer.I_c + 1, bayer.I_r)[0];

        // Assign R
        R = (R1 + R2) / 2;

        // Assign G
        G = bayer.at(bayer.I_c, bayer.I_r)[0];

        // Assign B
        B = (B1 + B2) / 2;

        // Return BGR
        return visioncpp::pixel::U8C3(B, G, R);
      } break;
      case 4:  // pixel B
      {
        // Init RGB Values
        uchar R;
        uchar G;
        uchar B;

        // Get G
        uchar G1 = bayer.at(bayer.I_c, bayer.I_r - 1)[0];
        uchar G2 = bayer.at(bayer.I_c + 1, bayer.I_r)[0];
        uchar G3 = bayer.at(bayer.I_c, bayer.I_r + 1)[0];
        uchar G4 = bayer.at(bayer.I_c - 1, bayer.I_r)[0];

        // Get B
        uchar B1 = bayer.at(bayer.I_c, bayer.I_r - 2)[0];
        uchar B2 = bayer.at(bayer.I_c + 2, bayer.I_r)[0];
        uchar B3 = bayer.at(bayer.I_c, bayer.I_r + 2)[0];
        uchar B4 = bayer.at(bayer.I_c - 2, bayer.I_r)[0];

        // Get R
        uchar R1 = bayer.at(bayer.I_c - 1, bayer.I_r - 1)[0];
        uchar R2 = bayer.at(bayer.I_c + 1, bayer.I_r - 1)[0];
        uchar R3 = bayer.at(bayer.I_c + 1, bayer.I_r + 1)[0];
        uchar R4 = bayer.at(bayer.I_c - 1, bayer.I_r + 1)[0];

        // Assign R
        R = (R1 + R2 + R3 + R4) / 4;

        // Assign G
        if (abs(B1 - B3) < abs(B2 - B4)) {
          G = (G1 + G3) / 2;
        } else if (abs(B1 - B3) > abs(B2 - B4)) {
          G = (G2 + G4) / 2;
        } else {
          G = (G1 + G2 + G3 + G4) / 4;
        }

        // Assign B
        B = bayer.at(bayer.I_c, bayer.I_r)[0];

        // Return BGR
        return visioncpp::pixel::U8C3(B, G, R);
      } break;
      default: {
        return visioncpp::pixel::U8C3(0, 0, 0);  // avoid warning
      } break;
    }
  }
};

// main program
int main(int argc, char **argv) {
  // Load the
  cv::Mat bayer = cv::imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);

  if (!bayer.data) {
    std::cout 

Web Proxy Viewer  |  New URL  |  Original Page