Obraz cyfrowy

Próbkowanie 

Próbkowanie (oczywiście troszkę oszukaną) mona uzyskać dzięki funkcji resize() bibljoteki OpenCV:

#include <cstdlib>
#include <iostream>
#include <string>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;

int main(){      
    Mat img = imread("./LENA_512.jpg", 1 );
    cvtColor(img, img, CV_RGB2GRAY);
    namedWindow( "1", WINDOW_AUTOSIZE );
    imshow( "1", img ); 
    resize( img, img, Size( img.cols/10, img.rows/10 ));
    namedWindow( "2", WINDOW_AUTOSIZE );
    imshow( "2", img );    
    resize( img, img, Size( img.cols/10, img.rows/10 ));    
    namedWindow( "4", WINDOW_AUTOSIZE );
    imshow( "4", img );
    waitKey();           
    return 0;   
}

Kwantyzacji 

Kwantyzacji za pomocą programu OpecCV można dokonać za pomocą poniższego programu

#include <cstdlib>
#include <iostream>
#include <string>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;

int main(){      
  Mat img = imread("./WIR_360.jpg", 1 );
  cvtColor(img, img, CV_RGB2GRAY);

  for(int i = 0 ; i < 8; i ++){
    Mat img_temp = img.clone();
    for(int row=0; row < img.rows; row++){
      for(int col=0; col < img_temp.cols; col++){
        uchar mask = 0xFF << (8-i);
        uchar color = img.at(row,col);
        img_temp.at(row,col) = color & mask;
      }
    }  
    namedWindow("Level", WINDOW_AUTOSIZE );
    imshow("Level", img_temp); 
    waitKey();
  }                 
  return 0;   
}

W powyższym programie użyte zostało przesunięcie bitowe. W wyniku tego kolory są zapisywane odpowiednio na 1, 2,...,8 bitach. 

Kwantyzacji za pomocą LUT 

#include <cstdlib>
#include <iostream>
#include <string>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <math.h> 
#include <algorithm>
using namespace cv;
using namespace std;
int main(){     
  Mat img = imread("./WIR_360.jpg", 1 );
  cvtColor(img, img, CV_RGB2GRAY);
  for(int i = 1; i < 9; i++){
    Mat LUT_img = img.clone();
    int B = 8;
    int B_new = i;
    double delta = std::pow(2.0,B)/std::pow(2.0,B_new);
    Mat lookUpTable(1, 256, CV_8U);
    uchar* p = lookUpTable.data;
    for( int i = 0; i < 256; ++i){
      p[i] = (int) std::max((i-(delta/2.0)-1.0)/delta,0.0)*delta+(delta/2.0-1.0);
    }
    LUT(img, lookUpTable, LUT_img);
    namedWindow( "LUT", CV_WINDOW_AUTOSIZE );
    imshow( "LUT" , LUT_img );
    waitKey(); 
  }  
  
  return 0;   
}