ภาพรวม
สาธิตการ ลดจำนวนสี (Color Reduction / Posterization) โดยใช้ Mat Iterator (C++ STL Style) เข้าถึงพิกเซลแบบ Type-Safe
หลักการ
Quantize ค่าพิกเซล: newVal = (oldVal / div) * div + div/2
เช่น div=64: ค่า 0-63 → 32, 64-127 → 96, 128-191 → 160, 192-255 → 224
Mat Iterator
Mat_<Vec3b>::iterator: Iterator สำหรับภาพ 3-Channel (Vec3b = uchar[3])image.begin<Vec3b>(),image.end<Vec3b>(): เริ่ม/จบ- เข้าถึง Channel:
(*it)[0],(*it)[1],(*it)[2]
โค้ดตัวอย่าง C++
#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; // Blue
(*it)[1] = (*it)[1] / div * div + div / 2; // Green
(*it)[2] = (*it)[2] / div * div + div / 2; // Red
}
}
int main() {
Mat image = imread("mango.jpg");
namedWindow("Image Window");
reducing_Color(image); // div=64 (Default)
imshow("Image Window", image);
waitKey(0);
return 0;
}
ผลลัพธ์
ภาพมีสีน้อยลง (Posterize) แบนดัดเป็น 4 ระดับต่อ Channel (64, 128, 192, 256 → 32, 96, 160, 224)

เปรียบเทียบวิธีเข้าถึงพิกเซล
| Method | Syntax | Speed | Safety |
|---|---|---|---|
| Ptr/Pointer | img.ptr<uchar>(y)[x] | Fastest | Manual bounds check |
| at() | img.at<Vec3b>(y,x) | Medium | Bounds checked |
| Iterator | for(auto it=begin(); it!=end(); ++it) | Fast | Type-safe, STL style |