#include <opencv2corecore.hpp> #include <opencv2highguihighgui.hpp> #include <opencv2imgprocimgproc.hpp> #include <iostream> void colorReduce(cv::Mat& image, int div=64) { int nr = image.rows; int nc = image.cols * image.channels(); int n = static_cast<int>( cv::log(static_cast<double>(div)) / cv::log(2.0) ); uchar mask = 0xFF << n; for(int i=0; i<nr; i++) { uchar* data = image.ptr<uchar>(i); for(int j=0; j<nc; j++) { //*data++ = *data - *data % div + div / 2; *data++ = (*data & mask) + div / 2; } } } int main(int argc, char** argv) { cv::Mat img = cv::imread("F:\images\boldt.jpg"); cv::Mat img2 = img.clone(); double duration; duration = static_cast<double>(cv::getTickCount()); colorReduce(img2); duration = static_cast<double>(cv::getTickCount()) - duration; duration /= cv::getTickFrequency(); cv::namedWindow("original"); cv::imshow("original", img); cv::namedWindow("altered"); cv::imshow("altered", img2); std::cout << duration << std::endl; cv::waitKey(0); return 0; }