1 #include <opencv2highguihighgui.hpp> 2 #include <opencv2imgprocimgproc.hpp> 3 #include <opencv2corecore.hpp> 4 5 void colorReduce(cv::Mat& img, int div=64); 6 7 8 int main() 9 { 10 cv::Mat img_orginal = cv::imread("F:\images\boldt.jpg"); 11 cv::Mat img_altered = img_orginal.clone(); 12 13 colorReduce(img_altered); 14 15 cv::namedWindow("orignal"); 16 cv::imshow("orignal", img_orginal); 17 cv::namedWindow("altered"); 18 cv::imshow("altered", img_altered); 19 20 cv::waitKey(); 21 22 return 0; 23 } 24 25 void colorReduce(cv::Mat& img, int div) 26 { 27 int n = cv::log(static_cast<double>(div)) / cv::log(2.0); 28 int mask = 0xFF << n; 29 30 // 方式一: 31 //cv::Mat_<cv::Vec3b>::iterator it = img.begin<cv::Vec3b>(); 32 // 方式二: 33 cv::MatIterator_<cv::Vec3b> it = img.begin<cv::Vec3b>(); 34 for(; it!=img.end<cv::Vec3b>(); it++) 35 { 36 (*it)[0] = (*it)[0] & mask + div / 2; 37 (*it)[1] = (*it)[1] & mask + div / 2; 38 (*it)[2] = (*it)[2] & mask + div / 2; 39 } 40 }