Thursday 21 May 2015

Grey world algorithm in OpenCV

The following code implements the grey world algorithm in OpenCV. Grey world hypothesis assumes that the statistical mean of a scene is achromatic. Based on this assumption obtains an estimate for the scene illuminant to perform colour correction (white balancing)

#include <iostream> //preprocessor directive

#include<vector>

#include "opencv2/opencv.hpp" //include OpenCV libraries




//Main function (starting point of execution)
 
 
int main(int argc, char argv[])



{
 
// Read the image from file (replace the image file name in your code)

cv::Mat imgIn = cv::imread("snow.jpg");

//Check if the image is empty

if ( imgIn.empty() )



{
 
//Print error message

std::cout << "Error occured when loading the image" << std::endl;

//Return negative 1 to indicate an error has occured in the program

return -1;



}
 
//Sum the colour values in each channel

cv::Scalar sumImg=sum(imgIn);

//normalise by the number of pixes in the image to obtain an extimate for the illuminant

cv::Scalar illum=sumImg/(imgIn.rows*imgIn.cols);

// Split the image into different channels

std::vector<cv::Mat> rgbChannels(3);



cv::split(imgIn, rgbChannels);
 
//Assign the three colour channels to CV::Mat variables for processing

cv::Mat redImg=rgbChannels[2];

cv::Mat graanImg=rgbChannels[1];

cv::Mat blueImg=rgbChannels[0];

//calculate scale factor for normalisation you can use 255 instead

double scale=(illum(0)+illum(1)+illum(2))/3;

//correct for illuminant (white balancing)



redImg=redImg*scale/illum(2);

graanImg=graanImg*scale/illum(1);

blueImg=blueImg*scale/illum(0);
 
//Assign the processed channels back into vector to use in the cv::merge() function



rgbChannels[0]=blueImg;

rgbChannels[1]=graanImg;

rgbChannels[2]=redImg;
 
cv::Mat imgOut; //to hold the output image

/// Merge the processed colour channels



merge(rgbChannels, imgOut);
 
//Create a window

cv::namedWindow("My Window", 1);

//Display the image

imshow("My Window", imgOut);

// Wait until a key is pressed



cv::waitKey(0);
 
//Return 0 to indicate normal run of the program

return 0;



}

Wednesday 20 May 2015

Create a negative image in OpenCV

The following code shows how to create a negative in OpenCV.

#include <iostream> //preprocessor directive

#include "opencv2/opencv.hpp" //include OpenCV libraries




//Main function (starting point of execution)
 
 
int main(int argc, char argv[])



{
 
// Read the image from file (replace the image file name in your code)

cv::Mat imgIn = cv::imread("snow.jpg");

//Check if the image is empty

if ( imgIn.empty() )



{
 
//Print error message

std::cout << "Error occured when loading the image" << std::endl;

//Return negative 1 to indicate an error has occured in the program

return -1;



}
 
//Scan all the rows of the image

for (int row=0;row<imgIn.rows;row++)



{
 
//Scan all the columns of the image

for (int col=0;col<imgIn.cols;col++)



{
 
//Invert each colour channel

imgIn.at<cv::Vec3b>(row,col)[0]=255-imgIn.at<cv::Vec3b>(row,col)[0];

imgIn.at<cv::Vec3b>(row,col)[1]=255-imgIn.at<cv::Vec3b>(row,col)[1];

imgIn.at<cv::Vec3b>(row,col)[2]=255-imgIn.at<cv::Vec3b>(row,col)[2];



}

}
 
//Create a window

cv::namedWindow("My Window", 1);

//Display the image

imshow("My Window", imgIn);

// Wait until a key is pressed



cv::waitKey(0);
 
//Return 0 to indicate normal run of the program

return 0;



}

Processing pixels in OpenCV (Colour filter effect)

The following code shown how to open an image, process each pixel and display on the screen. The resultant image is an image filtered with red colour.

#include <iostream> //preprocessor directive

#include "opencv2/opencv.hpp" //include OpenCV libraries




//Main function (starting point of execution)


int main(int argc, char argv[])



{

// Read the image from file (replace the image file name in your code)

cv::Mat imgIn = cv::imread("snow.jpg");

//Check if the image is empty

if ( imgIn.empty() )



{

//Print error message

std::cout << "Error occured when loading the image" << std::endl;

//Return negative 1 to indicate an error has occured in the program

return -1;



}

//Scan all the rows of the image

for (int row=0;row<imgIn.rows;row++)



{

//Scan all the columns of the image

for (int col=0;col<imgIn.cols;col++)



{

//assign 255 to the red colour channel

imgIn.at<cv::Vec3b>(row,col)[2]=255;



}

}

//Create a window

cv::namedWindow("My Window", 1);

//Display the image

imshow("My Window", imgIn);

// Wait until a key is pressed



cv::waitKey(0);

//Return 0 to indicate normal run of the program

return 0;



}

Read an image and display it using OpenCV

The following code shows how to read an image and display it using OpenCV.


#include <iostream> //preprocessor directive

#include "opencv2/opencv.hpp" //include OpenCV libraries


//Main function (starting point of execution)
 
 
int main(int argc, char argv[])


{
// Read the image from file (replace the image file name in your code)

cv::Mat imgIn = cv::imread("your_image_filename.jpg");

//Check if the image is empty

if ( imgIn.empty() )


{
 
//Print error message

std::cout << "Error occured when loading the image" << std::endl;

//Return negative 1 to indicate an error has occured in the program

return -1;


}
 
//Create a window

cv::namedWindow("My Window", 1);

//Display the image

imshow("My Window", imgIn);

// Wait until a key is pressed



cv::waitKey(0);
 
//Return 0 to indicate normal run of the program

return 0;


}