Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

วิธีลดสี (Color Reduction) ด้วย Iterator Method ใน OpenCV C++



ภาพรวม

สาธิตการ ลดจำนวนสี (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)

วิธีลดสี (Color Reduction) ด้วย Iterator Method ใน OpenCV C++

เปรียบเทียบวิธีเข้าถึงพิกเซล

MethodSyntaxSpeedSafety
Ptr/Pointerimg.ptr<uchar>(y)[x]FastestManual bounds check
at()img.at<Vec3b>(y,x)MediumBounds checked
Iteratorfor(auto it=begin(); it!=end(); ++it)FastType-safe, STL style