How to do it...
To reduce the number of colors in an image, follow the next steps:
- The signature of our color reduction function will be as follows. The user provides an image and the per-channel reduction factor div:
void colorReduce(cv::Mat image, int div=64);
Here, the processing is done in-place; that is, the pixel values of the input image are modified by the function. See the There's more... section of this recipe for a more general function signature with input and output arguments.
- The processing is done simply by creating a double loop that goes over all the pixel values. The first loop scans every row, getting the pointer of the row image data:
for (int j=0; j<image.rows; j++) { // get the address of row j uchar* data= image.ptr<uchar>(j);
- The second loop goes over every column of the row pointer and applies the reduction of color with this formula:
for (int i=0; i<nc; i++) { // process each pixel --------------------- data[i]= data[i]/div*div + div/2; // end of pixel processing ---------------- } // end of line } }
- This function can be tested by loading an image and calling the function as follows:
// read the image image= cv::imread("boldt.jpg"); // process the image colorReduce(image,64); // display the image cv::namedWindow("Image"); cv::imshow("Image",image);
This will give you, for example, the following image (refer to the book's graphics PDF to view this image in color), as shown in this screenshot:
Let's see how the preceding instructions work when we execute them.