บทนำ
วิธี at ต้องระบุชนิดภาพทุกครั้งที่เข้าถึงพิกเซล วิธี Direct Access ใช้งานง่ายกว่า โดยระบุชนิด Mat ตั้งแต่ต้น เช่น Mat_<uchar>, Mat_<Vec3b>, Mat_<Vec2i> เป็นต้น
ตัวอย่าง: เพิ่ม Noise ให้ภาพด้วย Direct Access
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
void direct_access(Mat_<Vec3b> &image, int n) {
for (int x = 0; x < n; x++) {
int i = rand() % image.cols; // คอลัมน์สุ่ม
int j = rand() % image.rows; // แถวสุ่ม
image(j, i) = 0; // ตั้งค่าพิกเซลเป็นสีดำ (0,0,0)
}
}
int main() {
Mat_<Vec3b> image;
Mat unchanged_Image;
image = imread("sky.jpg");
unchanged_Image = imread("sky.jpg"); // โหลดภาพต้นฉบับไว้เปรียบเทียบ
namedWindow("Noisy Image");
namedWindow("Unchanged Image");
direct_access(image, 4000); // เพิ่ม noise 4000 จุด
imshow("Noisy Image", image);
imshow("Unchanged Image", unchanged_Image);
waitKey(0);
return 0;
}
อธิบายการทำงาน
- Mat_<Vec3b>: ประกาศเมทริกซ์สำหรับภาพสี 3 ช่องล่วงหน้า
- image(j, i) = 0: ตั้งค่าพิกเซลที่ตำแหน่ง (j,i) เป็นสีดำ (Vec3b(0,0,0))
- rand() % image.cols: สุ่มคอลัมน์ภายในขอบเขตภาพ
- rand() % image.rows: สุ่มแถวภายในขอบเขตภาพ
การประยุกต์ใช้
วิธีนี้เหมาะสำหรับ:
- การเพิ่ม Noise แบบสุ่ม (Salt & Pepper noise)
- การวาดจุดหรือรูปทรงพื้นฐาน
- การปรับเปลี่ยนพิกเซลจำนวนมากอย่างรวดเร็ว
ผลลัพธ์

สรุป
Direct Access Method ให้ความสะดวกและความเร็วในการเข้าถึงและแก้ไขพิกเซล โดยเฉพาะเมื่อต้องทำงานกับภาพสี (Multi-channel) บ่อยครั้ง