Giới thiệu
OpenCV cung cấp Mat_<Vec3b>::iterator tương thích STL để duyệt pixel hiệu quả. Giảm màu bằng cách lượng tử hóa (quantization) mỗi kênh: value = value/div*div + div/2.
Chương trình giảm màu dùng Iterator
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
void reducing_Color(Mat& image, int div = 64) {
Mat_<Vec3b>::iterator it = image.begin<Vec3b>();
Mat_<Vec3b>::iterator itend = image.end<Vec3b>();
for (; it != itend; ++it) {
(*it)[0] = (*it)[0] / div * div + div / 2;
(*it)[1] = (*it)[1] / div * div + div / 2;
(*it)[2] = (*it)[2] / div * div + div / 2;
}
}
int main() {
Mat image = imread("mango.jpg");
namedWindow("Image Window");
reducing_Color(image);
imshow("Image Window", image);
waitKey(0);
return 0;
}
Kết quả
Ảnh gốc và ảnh sau giảm màu (số màu ít hơn, hiệu ứng posterize, các vùng màu phẳng hơn).