บทนำ
ในการประมวลผลภาพ เราจะทำการคำนวณบนพิกเซลแต่ละจุด ดังนั้น จำนวนพิกเซลที่มากขึ้นจะทำให้การคำนวณใช้เวลานานขึ้น เพื่อลดเวลาในการประมวลผล จึงจำเป็นต้องสแกนภาพ (image scanning) ให้มีประสิทธิภาพสูงสุด บทความนี้จะสาธิตการเขียนลูปสแกนภาพอย่างมีประสิทธิภาพโดยใช้ Pointer ใน OpenCV
หลักการลดสี (Color Reduction)
ภาพสีแบบ RGB ประกอบด้วย 3 ช่องสี (channels) แต่ละช่องมีจำนวนพิกเซลเท่ากัน แต่มีค่าต่างกัน ค่าแต่ละค่าเป็น unsigned char 8-bit ซึ่งมีช่วงค่า 0-255 ทำให้จำนวนสีที่เป็นไปได้ทั้งหมดคือ 256 × 256 × 256 = 16,777,216 สี
เราสามารถลดจำนวนสีได้โดยการหารค่าพิกเซลแต่ละจุดด้วยลูกบาศก์ขนาดเท่ากัน ตัวอย่างเช่น หากหารด้วยลูกบาศก์ 8×8×8 จำนวนสีที่เป็นไปได้จะเหลือเพียง 32×32×32 = 32,768 สี การลดจำนวนสีทำให้ระบบทำงานเร็วขึ้น แต่การสแกนพิกเซลทุกจุดยังคงใช้เวลานาน นั่นคือเหตุผลที่เราต้องการวิธีการสแกนภาพที่มีประสิทธิภาพ
ตัวอย่างโค้ด: ลดสีด้วย Pointer Method
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
void reducing_Color(Mat &image, int div = 64) {
int total_rows = image.rows;
int total_columns = image.cols * image.channels();
for (int j = 0; j < total_rows; j++) {
uchar* data = image.ptr<uchar>(j);
for (int i = 0; i < total_columns; i++) {
data[i] = data[i] / div * div + div / 2;
}
}
}
int main() {
Mat image;
image = imread("grapes.jpg");
namedWindow("Image Window");
reducing_Color(image);
imshow("Image Window", image);
waitKey(0);
return 0;
}
อธิบายโค้ดสำคัญ
- image.ptr<uchar>(j): ดึง Pointer ไปยังแถวที่ j ของภาพ เพื่อเข้าถึงข้อมูลพิกเซลโดยตรง
- data[i] = data[i] / div * div + div / 2: สูตรลดสี โดยการปัดค่าพิกเซลให้อยู่ในช่วงที่กำหนด
- div = 64: ค่าเริ่มต้นสำหรับการลดสี (ให้ 4 ระดับต่อช่องสี)
ผลลัพธ์

สรุป
Pointer Method เป็นวิธีที่เร็วที่สุดในการเข้าถึงพิกเซลใน OpenCV เนื่องจากเข้าถึงหน่วยความจำโดยตรง ไม่มี overhead จากการตรวจสอบขอบเขต (bounds checking) เหมาะสำหรับการประมวลผลภาพขนาดใหญ่หรือต้องการความเร็วสูง